Использование Ubuntu Upstart для остановки демона - PullRequest
7 голосов
/ 19 февраля 2012

Я использую upstart для создания демона для порождённого скрипта fastcgi nginx python.Если я использую ниже, это работает:

sudo start myserver

Что не работает:

sudo stop myserver
stop: Unknown instance:

Ниже приведен мой файл conf с командой для остановки процесса.Я предполагаю, что команда для уничтожения процесса находится в сценарии pre-stop?

#!upstart
description "myserver"
author      "Test"

start on startup
stop on shutdown
respawn
#instance

script
    export HOME="/root"

    echo $$ > /var/run/myerver.pid
    exec spawn-fcgi -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001 >> /var/log/myserver.sys.log 2>&1
end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/myserver.sys.log
end script

pre-stop script
    rm /var/run/myserver.pid
    sudo kill `sudo lsof -t -i:9001`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/myserver.sys.log
end script

Ответы [ 3 ]

8 голосов
/ 07 сентября 2012

Лучший способ справиться с этим - заставить spawn-fcgi работать на переднем плане, а не демонизировать. Страница man для spawn-fcgi говорит, что опция -n делает это. Тогда вы можете переписать всю эту выскочку работы так:

start on runlevel [2345]
stop on runlevel [016]
respawn    

exec spawn-fcgi -n -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001 >> /var/log/myserver.sys.log 2>&1

Обратите внимание, что с Upstart 1.4 вам даже не нужно направление журнала, так как по умолчанию это «консольный журнал», который будет иметь все выходные данные в /var/log/upstart/$UPSTART_JOB.log .. так что это будет просто будь

start on runlevel [2345]
stop on runlevel [016]
respawn

exec spawn-fcgi -n -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001

Стоит отметить, что он запускается с правами root, но прослушивает порт 9001. Так что, вероятно, вам лучше работать, как никто. С Upstart 1.5 (Ubuntu 12.04 и более поздние версии) Просто добавьте это:

setuid nobody
setgid nogroup

(Возможно, вам придется изменить nobody / nogroup на ubuntu / ubuntu, поскольку ваши файлы находятся в / home / ubuntu)

Также обратите внимание, что start on startup не будет работать надежно, поскольку событие startup происходит до монтирования файловых систем и до запуска сети. Также start on shutdown просто не работает, так как это не настоящее событие. Смотрите man upstart-events, чтобы узнать больше событий.

2 голосов
/ 15 сентября 2012

Я считаю, что ваша предварительная остановка останавливает ваш сервер, поэтому, когда Upstart пытается остановить ваш сервер, нет запущенного процесса для остановки, и он выдает эту ошибку.

0 голосов
/ 16 декабря 2015

Если вы демонизируете свой процесс, вам нужно использовать ожидаемый демон или ожидаемую линию форка, чтобы upstart знал, что нужно отслеживать новый pid.

ex: запуск при запуске, остановка при завершении работы, ожидание, ожидание демона

Документация может быть найдена в готовой поваренной книге: http://upstart.ubuntu.com/cookbook/#expect-daemon http://upstart.ubuntu.com/cookbook/#expect-fork

...