Пусть Gnu Screen передает сигнал SIGTERM дочерним процессам, позволяя им полностью завершить работу

Мы используем Upstart для запуска / завершения бинарного кода, разработанного собственными силами.

В файле конфигурации 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. Добавление сценария предварительной остановки позволило мне идентифицировать сеанс Screen, а затем добавить в команды («quit \ n», а затем «y \ n») чистое отключение двоичного файла, который запускал Screen.

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]