Сделайте другой процесс обрабатывать SIGTERM правильно - PullRequest
0 голосов
/ 17 марта 2019

У меня есть программа, которую я хотел бы запустить под наблюдением.Когда программа запрограммирована на остановку, ей отправляется сигнал 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 тоже подойдет.

...