2014-02-20 3 views
0

Мы используем Upstart для запуска/завершения встроенного двоичного кода.Имейте Gnu Screen Pass Сигнал SIGTERM к дочерним процессам, позволяя им полностью отключиться

В файле конфигурации Upstart для этого двоичного файла, мы определяем сценарий как таковой:

script 
    exec su - user -c "screen -D -m -S $product /opt/bin/prog /opt/cfg/$product -v 5 --max_log_size=7" 
end script 

Когда уровень запуска устанавливается на 5, Upstart запускает скрипт. Когда уровень запуска установлен в 3, Upstart завершает сценарий.

Моя проблема заключается в том, что Upstart отправляет SIGTERM, а затем SIGKILL.

SIGTERM «обрабатывается» экраном, а не моим обычным двоичным кодом, поэтому обработчики сигналов в нашем двоичном файле не получают SIGTERM и, следовательно, не могут быть закрыты чисто.

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

ответ

0

Оказывается, мне пришлось подходить к этому с другой точки зрения и обрабатывать его через Upstart. Добавление сценария pre-stop позволило мне идентифицировать сеанс экрана, а затем заполнить команды («quit \ n», а затем «y \ n»), чтобы чисто закрыть двоичный файл, который был запущен на экране.

pre-stop script 
    SESSID=`ps -elf | grep '/opt/bin/prog /opt/cfg/$product' | grep SCREEN | awk '{print $4}'` 
    QUIT_CMD="screen -S $SESSID.$product -X stuff \"exit"$'\n'"\"" 
    exec `su spuser -c "$QUIT_CMD"` 
    QUIT_CMD="screen -S $SESSID.$product -X stuff \"y"$'\n'"\"" 
    exec `su spuser -c "$QUIT_CMD"` 
    sleep 20 
end script 
Смежные вопросы