Мы используем 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 и, таким образом, не могут быть полностью отключены.
Я проверил, что обработчики сигналов в нашем двоичном файле позволяют ему корректно завершать работу, когда он НЕ запускается через экран.
Оказывается, я должен был подойти к этому с другой точки зрения и справиться с этим с помощью 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
Других решений пока нет …