我正在尝试在我的 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 &
如果有人能解释为什么这种方法有效而原始解决方案无效,我会非常感兴趣......无论如何,我想我会分享我的经验,希望:
- 避免其他人因解决方案而头痛
- 提示有人站出来解释如何让这个工作按照我最初的想法工作:)
编辑 |这是现在感兴趣的两条线
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