Я пишу сценарий выскочки для небольшого сервиса, который написал для своих коллег. Моя выскочка может запустить службу, но когда она это делает, она только выводит 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, который при запуске без ошибок разветвляется с использованием приведенного ниже кода сразу после проверки параметров командной строки и базовой экологической работоспособности, поэтому я говорю выскочке: expect fork
.
pid = os.fork()
if pid != 0:
sys.exit(0)
Скрипт является исполняемым и имеет python shebang. Я могу отправить сигнал TERM процессу вручную, и он завершится корректно. Но бег stop queryqueue
претензии queryqueue stop/waiting
но процесс все еще жив и здоров. Кроме того, его журналы показывают, что он никогда не получал сигнал об уничтожении. Я предполагаю, что это потому, что выскочка не знает, какой у него pid. Я также пробовал expect daemon
и полностью оставив предложение expect, но в поведении нет никаких изменений.
Как я могу получить выскочку, чтобы определить pid процесса exec'd
В expect
строфа работает только для "основного" процесса ("exec
" или "script
"строфа). Это задокументировано в init (5).