У меня есть программа, которую я хотел бы запустить под наблюдением.Когда программа запрограммирована на остановку, ей отправляется сигнал SIGTERM
, а после некоторого времени ожидания - сигнал SIGKILL
.Моя проблема в том, что программа завершает работу неблагоразумно на SIGTERM
- она использует обработчик по умолчанию.
Ни изменение системы наблюдения, ни программа не являются для меня опцией.Я подумываю написать какую-нибудь оболочку, которая запустит программу, поймает SIGTERM
и запросит изящный выход в нее, что-то в строках этого псевдо-C:
// wrapper.c
setsid();
signal(SIGTERM, &make_child_exit_gracefully);
pid = fork() ? waitpid(pid) : exec("/sbin/naughty-program");
Проблема с этим подходом, что еслиnaughty-program
почему-то отклонить запрос на корректный выход, SIGKILL
из системы наблюдения убьет оболочку, но программа просто получит SIGHUP
, которую она может игнорировать.Таким образом, я могу закончить диким naughty-program
, переименованным в PID1 вместо того, чтобы быть убитым.
Есть ли более надежное решение?Можно ли как-то внедрить нетривиальный код в дочерний процесс для использования в качестве обработчика сигнала?Можно ли отобразить naughty-program
в адресное пространство оболочки и передать ему управление?
В идеале я ищу POSIX-совместимое решение, хотя для Linux тоже подойдет.