start-stop-daemon 不会将我的 Python 脚本作为服务启动

start-stop-daemon 不会将我的 Python 脚本作为服务启动

我正在尝试在我的 Debian 机器上运行 Google AppEngine,我创建了一个文件init.d/gae

. /lib/lsb/init-functions

#
# Initialize variables
#

name=gae
user=$name

pid=/var/run/$name.pid
prog="python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www"


case "${1}" in
   start)
      echo "Starting...Google App Engine"
      start-stop-daemon --start --make-pidfile --background --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog" 

      ;;

   stop)
      echo "Stopping...Google App Engine"

      ;;

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

   *)
      echo "Usage: ${0} {start|stop|restart}"
      exit 1
      ;;
esac

exit 0

# End scriptname

我正在通过手动调用来测试脚本,并且脚本运行但不作为守护进程运行,或者至少它不会与终端分离。我期待/寻找与 Apache 类似的功能。

我缺少什么开关?


编辑

我应该注意到,尽管开关指示应创建 PID 文件,但并未写入或创建该文件

答案1

我可以看到你有两个问题:

prog=python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www

/opt/google_appengine/dev_appserver.py将从prog=python环境开始。这是在你的start区块之前,所以start-stop-daemon甚至不参与其中。

快速解决方法是引用整个作业,如下所示:

prog='python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www'

但更好的解决方法是使用 的样式/etc/init.d/skeleton,然后执行

DAEMON='python /opt/google/appengine/dev_appserver.py'
DAEMON_ARGS='--host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www'

第二个问题是你错误地引用了$prog.

启动-停止-守护进程 --start --make-pidfile --background --oknodo --user "$user" --name "$name" --pidfile "$pid" --startas "$prog"

告诉start-stop-daemon尝试启动一个名为 的程序python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www

但显然没有这样的程序。你想python从争论开始。删除双引号是一种快速修复方法,但更好的方法/etc/init.d/skeleton是:

启动-停止守护进程 --start --quiet --chuid $CHUID --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS

答案2

我一生都无法弄清楚为什么 start-stop-daemon 不起作用...我正在运行 Debian 7.6 wheezy,我只能假设该功能已被禁用。

我将其更改为使用 /dev/null 和 & 以及瞧 - sciprt 启动并按预期保持运行...我从 mysql 窃取了代码:

$prog > /dev/null 2>&1 &

如果有人能解释为什么这种方法有效而原始解决方案无效,我会非常感兴趣......无论如何,我想我会分享我的经验,希望:

  1. 避免其他人因解决方案而头痛
  2. 提示有人站出来解释如何让这个工作按照我最初的想法工作:)

编辑 |这是现在感兴趣的两条线

prog='/usr/bin/python /opt/google_appengine/dev_appserver.py --host=0.0.0.0 --admin_host=0.0.0.0 --php_executable_path=/usr/bin/php-cgi /var/www'

start-stop-daemon --start --make-pidfile --background --oknodo --user $user --name $name --pidfile $pid --exec $prog

相关内容