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