Задний план
Меня попросили создать systemd
скрипт для нового сервиса, foo_daemon
который иногда попадает в «плохое состояние» и не погибает через него SIGTERM
(вероятно, из-за пользовательского обработчика сигнала). Это проблематично для разработчиков, так как им поручено запустить / остановить / перезапустить сервис через:
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
проблема
Иногда, из- foo_daemon
за плохого состояния, мы вынуждены его принудительно убивать:
systemctl kill -s KILL foo_daemon.service
Вопрос
Как я могу настроить свой systemd
сценарий foo_daemon
так, чтобы всякий раз, когда пользователь пытается остановить / перезапустить службу,systemd
он:
- Попытка постепенного отключения
foo_daemon
черезSIGTERM
. - Дайте до 2 секунд для выключения / прекращения
foo_daemon
завершения. - Попытайтесь принудительно отключить функцию
foo_daemon
via,SIGKILL
если процесс еще активен (поэтому у нас нет риска повторного использования PID иsystemd
проблемSIGKILL
с неправильным PID). Устройство, которое мы тестируем, быстро порождает / разветвляет многочисленные процессы, поэтому существует редкая, но очень реальная проблема, связанная с рециркуляцией ПИД, вызывающей проблему. - Если на практике я просто параноик по поводу рециркуляции PID, я в порядке со сценарием, который просто выдает
SIGKILL
против PID процесса, не заботясь об уничтожении переработанного PID.