Достаточно часто бывает необходимость не позволять сервисам падать «наглухо», а рестартовать их в случае аварийного завершения. Systemd позволяет это сделать достаточно просто.
Рассмотрим в качестве примера древний сервис php5-fpm:
systemctl status php5-fpm.service ● php5-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-06-30 10:14:55 MSK; 12h ago Process: 9349 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS) Main PID: 9354 (php5-fpm) Status: "Processes active: 0, idle: 5, Requests: 499, slow: 0, Traffic: 0req/sec" Tasks: 6 (limit: 4700) Memory: 857.9M CGroup: /system.slice/php5-fpm.service ├─ 9354 php-fpm: master process (/etc/php5/fpm/php-fpm.conf) ├─ 9357 php-fpm: pool web19 ├─ 9358 php-fpm: pool web19 ├─ 9359 php-fpm: pool www ├─ 9360 php-fpm: pool www └─20671 php-fpm: pool www
Открываем на редактирование файл /lib/systemd/system/php5-fpm.service и видим обычное содержимое:
[Unit] Description=The PHP FastCGI Process Manager After=network.target [Service] Type=notify PIDFile=/var/run/php5-fpm.pid ExecStartPre=/usr/lib/php5/php5-fpm-checkconf ExecStart=/usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target
В случае некорректного завершения его работы, он не перезапустится автоматически и сайты, которые он ещё обслуживает, будут недоступны. Чтобы сервис перезапустился автоматически, нужно в секцию Unit добавить следующий строки:
StartLimitIntervalSec=500 StartLimitBurst=5
А в секцию Service добавить:
Restart=on-failure RestartSec=5s
После добавления нужно заставить systemd перечитать конфиги:
systemctl daemon-reload
И теперь, если сервис вдруг остановится по незапланированным причинам, в течение 5 секунд он будет перезапущен. Попыток рестарта сервиса будет 5 в течение 500 секунд и если все эти попытки закончатся неудачей, дальнейших попыток перезапуска не будет. Этого времени должно хватить сисадмину, чтобы среагировать на проблему вручную. 🙂