2

我正在寻找一种方法来通过一个简单的配置文件和一个标准接口来管理多个监听不同端口的 Twiggy 实例。

例如,我想要一个看起来像

dog 5000 /www/psgi/dog.pl
cow 5001 /www/psgi/holycow.pl
# ...

以及 /etc/init.d 中的一个脚本,其使用如下

sudo service twiggy start
# start all services
sudo service twiggy restart dog
# cow remains intact
# ...

我的一些同事建议使用 runit,它看起来很有希望,但是我对它还不够熟悉。

在开始编写自己的脚本之前,我敢于问:是否已经存在?

4

2 回答 2

1

查看Daemon::Control来管理你的守护进程并自动编写初始化脚本

于 2012-09-17T13:01:17.657 回答
1

为 Twiggy::Prefork 编写了 Server::Starter 初始化脚本。但它适用于一个 psgi 应用程序。也许它对你有用。

这是为 Twiggy 修改的脚本:

#!/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/start_server
NAME=start_server
DESC=start_server
RUNDIR=/var/run/start_server

PIDFILE=$RUNDIR/start_server.pid
STATUSFILE=$RUNDIR/start_server.status

PSGI_APP='/path_to_psgi_app/app.pl'

HTTP_SERVER="plackup --no-default-middleware -s Twiggy -a $PSGI_APP"
LOGGER="2>&1 | logger -p daemon.notice -t $DESC"
DAEMON_ARGS="--port=6000 -- $HTTP_SERVER $LOGGER"

if [ ! -e $PSGI_APP ]; then
  echo "'$PSGI_APP' does not exist"
  exit 1
fi

case "$1" in
  start)
    echo -n "Starting $DESC: "

    mkdir -p $RUNDIR
    chown www-data:www-data $RUNDIR
    chmod 755 $RUNDIR

    if start-stop-daemon --start --name $NAME --pidfile $PIDFILE \
        --chuid www-data:www-data --exec /usr/bin/perl --startas \
        /bin/bash -- -c "$DAEMON --pid-file $PIDFILE --status-file $STATUSFILE $DAEMON_ARGS &"
    then
      echo "$NAME."
    else
      echo "failed"
    fi
    ;;

  stop)
    echo -n "Stopping $DESC: "
    if start-stop-daemon --stop --retry forever/TERM/10 --quiet --oknodo \
        --name $NAME --pidfile $PIDFILE
    then
      echo "$NAME."
    else
      echo "failed"
    fi
    sleep 1
    ;;

  reload)
    echo -n "Reloading $DESC: "
    if $DAEMON --pid-file $PIDFILE --status-file $STATUSFILE --restart
    then
      echo "$NAME."
    else
      echo "failed"
    fi
    ;;

  restart)
    ${0} stop
    ${0} start
    ;;

  status)
    echo -n "$DESC is "
    if start-stop-daemon --stop --quiet --signal 0 --name ${NAME} --pidfile ${PIDFILE}
    then
      echo "running"
    else
      echo "not running"
      exit 1
    fi
    ;;
esac

exit 0
于 2014-09-05T08:48:26.167 回答