我正在为同事编写的一项小型服务编写 upstart 脚本。我的 upstart 作业可以启动该服务,但启动时只输出queryqueue start/running
;请注意,没有为其他服务提供的 pid。
#/etc/init/queryqueue.conf
description "Query Queue Daemon"
author "---"
start on started mysql
stop on stopping mysql
expect fork
env DEFAULTFILE=/etc/default/queryqueue
umask 007
kill timeout 30
pre-start script
#if [ -f "$DEFAULTFILE" ]; then
# . "$DEFAULTFILE"
#fi
[ ! -f /var/run/queryqueue.sock ] || rm -rf /var/run/queryqueue.sock
#exec /usr/local/sbin/queryqueue -s /var/run/queryqueue.sock -d -l /tmp/upstart.log -p $PIDFILE -n $NUM_WORKERS $CLEANCACHE $FLUSHCACHE $CACHECONN
end script
script
#Originally this stanza didn't exist at all
if [ -f "$DEFAULTFILE" ]; then
. "$DEFAULTFILE"
fi
exec /usr/local/sbin/queryqueue -s /var/run/queryqueue.sock -d -l /tmp/upstart.log -p $PIDFILE -n $NUM_WORKERS $CLEANCACHE $FLUSHCACHE $CACHECONN
end script
post-start script
for i in `seq 1 5` ; do
[ -S /var/run/queryqueue.sock ] && exit 0
sleep 1
done
exit 1
end script
有问题的服务是一个 python 脚本,它在运行时如果没有错误,会在检查命令行选项和基本环境健全性后立即使用下面的代码分叉,所以我告诉 upstart expect fork
。
pid = os.fork()
if pid != 0:
sys.exit(0)
该脚本是可执行的,并且有一个 python shebang。我可以手动向进程发送 TERM 信号,它会正常退出。但运行stop queryqueue
声明queryqueue stop/waiting
该进程仍然运行良好。此外,它的日志表明它从未收到过 kill 信号。我猜这是因为 upstart 不知道它有哪个 pid。我也尝试过expect daemon
完全省略 expect 子句,但行为没有任何变化。
我怎样才能让 upstart 确定执行进程的 pid
答案1
此expect
节仅适用于“主”进程(“ exec
”或“ script
”节)。这在 init(5) 中有记录。