Существует разница между сбоем «демона» и сбоем «службы».
Сбой демона просто означает, что программа завершилась каким-либо образом, кроме возврата 0 в качестве кода выхода. Это то, на что ссылается Restart=on-failure
, т.е. «Перезапустить демон в случае сбоя». Кроме того, вы можете перезапустить при других условиях, см. таблицу в разделе Restart= , которая также объясняет, что именно означает «при -сбое»..
Согласно вашему служебному файлу, нет определения "сервисного" сбоя, и я думаю, что определение по умолчанию в основном таково: "демон вышел каким-то образом, отличным от возврата 0 в качестве кода выхода, И в настоящее время он не запущен", но ваш service немедленно перезапустил демон. Так что он, вероятно, входит в состояние «сбой», но на короткое время вы этого не замечаете. Вы можете проверить журнал с помощью journalctl -u foo.service
.
Также следует проверить, остался ли PID основного процесса таким же, каким он был +30 секунд назад. Если PID отличается, это означает, что systemd убивает демона, потому что он никогда не вызывал sd_notify
, а затем systemd очень быстро перезапускает демона, потому что ваш служебный файл говорит перезапустить его в случае сбоя и не говорит ему ждать между перезапускает (см. ниже ).
Если вы хотите, чтобы ваш сервис имел определение сбоя, вы можете использовать что-то вроде:
StartLimitInterval=5min
StartLimitBurst=4
Эти параметры подробно описаны здесь , однако в основном эти два значения в данном примере означают: «Запускать демон не более 4 раз за 5-минутный интервал. Если он запущен, а затем, столько раз за этот интервал служба считается в состоянии сбоя". Если это произойдет, то берется StartLimitAction=
, по умолчанию это значение отсутствует.
Другим настраиваемым значением является RestartSec=
. Из документации :
Configures the time to sleep before restarting a service (as configured with Restart=). Takes a unit-less value in seconds, or a time span value such as "5min >20s". Defaults to 100ms.
Что в основном означает, что systemd должен подождать как минимум RestartSec=
перед повторным запуском демона.
Таким образом, вы можете комбинировать все эти параметры, но, допустим, вы используете эти значения:
StartLimitInterval=5min
StartLimitBurst=4
RestartSec=2min
Тогда служба никогда не сможет перейти в состояние сбоя, поскольку определение сбоя таково:
If in a given 5 minute interval, the service has been started, and then failed 4 times.
Но systemd не будет повторно -запускать службу в течение двух минут после последнего сбоя, поэтому она никогда не достигнет StartLimitBurst
внутри StartLimitInterval
.
Можно выполнить unattended-upgrades
во время процесса выключения, что позволит вам выполнить apt
в любое время вместо прерывания процесса apt
.
Включите эту опцию в/etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::InstallOnShutdown "true";
cat /etc/apt/apt.conf.d/50unattended-upgrades
:
// Install all updates when the machine is shutting down
// instead of doing it in the background while the machine is running.
// This will (obviously) make shutdown slower.
// Unattended-upgrades increases logind's InhibitDelayMaxSec to 30s.
// This allows more time for unattended-upgrades to shut down gracefully
// or even install a few packages in InstallOnShutdown mode, but is still a
// big step back from the 30 minutes allowed for InstallOnShutdown previously.
// Users enabling InstallOnShutdown mode are advised to increase
// InhibitDelayMaxSec even further, possibly to 30 minutes.
//Unattended-Upgrade::InstallOnShutdown "false";