【问题标题】:Init scripts for Twiggy-based PSGI apps基于 Twiggy 的 PSGI 应用程序的初始化脚本
【发布时间】:2012-09-09 09:56:32
【问题描述】:

我正在寻找一种方法来管理多个 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,看起来很有希望,但我对它还不够熟悉。

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

【问题讨论】:

  • 找到了similar question,但我似乎还有一些额外的要求。
  • 您的目标是哪个初始化平台?有很好的旧 SysV,有 upstart(Ubuntu),有 systemd(Fedora),有 BSD 风格,有 launchd(OS X)等等。
  • @Charles 好问题。我们目前正在使用 FreeBSD,但考虑迁移到 Linux (SysV)
  • 我认为这将是真正的问题。初始化脚本惊人地 是特定于操作系统的。您可能必须专门为您打算定位的每个平台制作一个。下面建议的 Daemon::Control 看起来非常好......对于 Linux。

标签: perl init.d psgi


【解决方案1】:

查看Daemon::Control 了解管理守护进程和自动编写初始化脚本的方法

【讨论】:

  • 终于掌握了 Daemon::Control,谢谢推荐。似乎很容易扩展到我想要的内容(或者我可以编写 100500 个自定义脚本,这很容易)。
【解决方案2】:

我写了Server::Starter init script for Twiggy::Prefork。但它适用于一个 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

【讨论】:

  • 虽然这可能会提供答案,但请始终在答案正文中包含链接项目的核心概念。不幸的是,链接会随着时间的推移而消失。
猜你喜欢
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多