Автозапуск упавшего сервиса в systemd

Достаточно часто бывает необходимость не позволять сервисам падать «наглухо», а рестартовать их в случае аварийного завершения. Systemd позволяет это сделать достаточно просто.

Рассмотрим в качестве примера древний сервис php5-fpm:

systemctl status php5-fpm.service_x000D_● php5-fpm.service - The PHP FastCGI Process Manager_x000D_ Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled; vendor preset: enabled)_x000D_ Active: active (running) since Wed 2021-06-30 10:14:55 MSK; 12h ago_x000D_ Process: 9349 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)_x000D_ Main PID: 9354 (php5-fpm)_x000D_ Status: "Processes active: 0, idle: 5, Requests: 499, slow: 0, Traffic: 0req/sec"_x000D_ Tasks: 6 (limit: 4700)_x000D_ Memory: 857.9M_x000D_ CGroup: /system.slice/php5-fpm.service_x000D_  ├─ 9354 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)_x000D_  ├─ 9357 php-fpm: pool web19_x000D_  ├─ 9358 php-fpm: pool web19_x000D_  ├─ 9359 php-fpm: pool www_x000D_  ├─ 9360 php-fpm: pool www_x000D_  └─20671 php-fpm: pool www_x000D_

Открываем на редактирование файл /lib/systemd/system/php5-fpm.service и видим обычное содержимое:

_x000D_[Unit]_x000D_Description=The PHP FastCGI Process Manager_x000D_After=network.target_x000D__x000D_[Service] _x000D_Type=notify_x000D_PIDFile=/var/run/php5-fpm.pid_x000D_ExecStartPre=/usr/lib/php5/php5-fpm-checkconf_x000D_ExecStart=/usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf_x000D_ExecReload=/bin/kill -USR2 $MAINPID_x000D__x000D_[Install]_x000D_WantedBy=multi-user.target_x000D_

В случае некорректного завершения его работы, он не перезапустится автоматически и сайты, которые он ещё обслуживает, будут недоступны. Чтобы сервис перезапустился автоматически, нужно в секцию Unit добавить следующий строки:

_x000D_StartLimitIntervalSec=500_x000D_StartLimitBurst=5_x000D_

А в секцию Service добавить:

_x000D_Restart=on-failure_x000D_RestartSec=5s_x000D_

После добавления нужно заставить systemd перечитать конфиги:

systemctl daemon-reload

И теперь, если сервис вдруг остановится по незапланированным причинам, в течение 5 секунд он будет перезапущен. Попыток рестарта сервиса будет 5 в течение 500 секунд и если все эти попытки закончатся неудачей, дальнейших попыток перезапуска не будет. Этого времени должно хватить сисадмину, чтобы среагировать на проблему вручную.

EnglishRussianUkrainian