Назад | Перейти на главную страницу

Upstart не может определить pid моего процесса

Я пишу сценарий выскочки для небольшого сервиса, который написал для своих коллег. Моя выскочка может запустить службу, но когда она это делает, она только выводит 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).