How to automatically restart Linux services with Systemd
Getting your Linux deployments working reliably is of paramount concern for production applications. One way to guarantee that a service is always available is to ensure that it is automatically restarted in the event of a crash, and Systemd provides the necessary tools to make it happen.
A useful feature that is often needed for long-running processes such as web servers is the ability to automatically restart the process in the event of a crash in order to minimise downtime. If your service is being managed by Systemd, you can use the /etc/systemd/system/daemon.service
[Unit] Description=Your Daemon Name [Service] ExecStart=/path/to/executable Restart=on-failure RestartSec=1s [Install] WantedBy=multi-user.target
In the above service configuration file, Restart is set to on-failure so that the service is restarted if the service exits with a non-zero exit code, or if terminated using a signal (such as using the kill command for example). The RestartSec option configures the amount of time to wait before restarting the service. Here, it’s set to one second to override the default value of 100ms.
After updating your Systemd unit file, ensure to run the command below to ensure your changes take effect:
$ sudo systemctl daemon-reload
Two other useful options that you should be aware of are StartLimitIntervalSec and StartLimitBurst . They are both useful for configuring when Systemd should stop trying to restart a service. The former specifies a time interval in seconds, while the latter specifies the maximum amount of times that is allowed for the service to be restarted within the specified interval.
[Unit] Description=Your Daemon Name StartLimitIntervalSec=300 StartLimitBurst=5 [Service] ExecStart=/path/to/executable Restart=on-failure RestartSec=1s [Install] WantedBy=multi-user.target
According to the configuration above, the service is not allowed to restart more than five times within a 300 second interval. If the service crashes more than five times, it will not be permitted to start anymore.
After reloading the systemd manager configuration ( sudo systemctl daemon-reload ), kill your running service and confirm that it is automatically restarted after the time specified by RestartSec has elapsed.
About the Author
Ayo is a Software Developer by trade. He enjoys writing about diverse technologies in web development, mainly in Go and JavaScript/TypeScript.
Learn more.
Автоматический перезапуск сервиса Linux
Иногда сервисы ни с того ни с сего падают и приходиться их вручную восстанавливать. Если для пользователя домашнего компьютера это не критично, потому что если сервис падает во время разработки, то это даже хорошо, можно сразу увидеть что есть проблема. Но на серверах и VPS сервисы должны работать постоянно для обеспечения доступа к веб-сайту или приложению.
В этой инструкции я покажу как настроить автоматический перезапуск сервиса Linux несколькими способами: с помощью скрипта мониторинга периодически запускаемого через cron и в systemd.
Автоматический перезапуск сервиса в systemd
По умолчанию, если ваш сервис будет убит или завершится некорректно, systemd не будет с ним ничего делать. Но можно настроить сервис так, чтобы при падении или даже остановке он автоматически перезапускался. Для этого используется директива Restart, которую надо добавить в секцию Service. Этот параметр может иметь такие значения:
- on-failure — только если произошла ошибка;
- on-success — только если процесс сервиса завершился без ошибок;
- on-abnormal — только если сервис не отвечает;
- always — перезапускать всегда, когда сервис был остановлен;
Например, рассмотрим настройку автоматического перезапуска сервиса Apache:
sudo systemctl edit apache2 [Service]
Restart=on-failure
RestartSec=5s
Директива RestartSec указывает сколько ждать перед перезапуском сервиса. Когда завершите сохраните изменения и выполните команду daemon-reload, чтобы перечитать конфигурацию:
sudo systemctl daemon-reload
Затем чтобы проверить что всё работает посмотрите состояние процесса, завершите процесс сигналом kill:
sudo systemctl status apache2 kill -KILL 32091
И снова посмотрите состояние. Процесс будет запущен. Система инициализации автоматически перезапустит его как только он завершится с кодом возврата ошибки. Если вы хотите чтобы процесс перезапускался всегда, необходимо использовать директиву Restart: always. Однако с ней надо быть осторожным, она вовсе не даст вам завершить процесс, даже если будет необходимо. Для того, чтобы процесс, который постоянно падает не перезапускался, можно добавить лимит на количество перезапусков в секцию Service:
sudo systemctl edit apache2 [Service]
StartLimitIntervalSec=500
StartLimitBurst=5
Restart=on-failure
RestartSec=5s
Директивы StartLimitBurst и StartLimitIntervalSec указывают, что надо попытаться перезапустить сервис пять раз, и если он все эти пять раз упадёт, то больше его не трогать. Вторая директива ограничивает время перезапусков сервиса до 500 секунд.
Автоматический перезапуск сервиса с помощью скрипта
Это самый простой и самый надежный способ работающий абсолютно во всех дистрибутивах Linux и не требующий установки дополнительных утилит. Для того же Apache скрипт выглядит следующим образом:
sudo vi /usr/local/bin/apache-monitor.sh #!/bin/bash
ps -A | grep apache2 || systemctl start apache2
Сохраните файл, сделайте его исполняемым:
chmod ugo+x /usr/local/bin/apache-monitor.sh
Теперь добавьте запись в cron для периодического запуска скрипта:
На этом все, автоматический перезапуск сервисов штука может и немного сложная, но необходимая в серьезных системах.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to use Systemd to restart a service when down? [closed]
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question does not appear to be about a specific programming problem, a software algorithm, or software tools primarily used by programmers. If you believe the question would be on-topic on another Stack Exchange site, you can leave a comment to explain where the question may be able to be answered.
On my server I use elasticSearch which regularly goes down and the result is a 500 error for my users. I understand Systemd is now the reference for managing services. How can I use Systemd to restart my elastic search service automatically when it goes down? I found ways to restart it, but not automatically without me checking if it’s down.
3 Answers 3
If you are using a systemd service file to start your service, then add the lines below to your service file from where you are starting your service:
[Service] Type=simple ExecStart=here will be your service executable name Restart=always RestartSec=0
- Restart= Configures whether the service shall be restarted when the service process exits, is killed, or a timeout is reached. Takes one of the following values: no , on-success , on-failure , on-abnormal , on-watchdog , on-abort or always . If set to no (the default).
- RestartSec= Configures the time to sleep before restarting a service (as configured with Restart= ). Takes a unit-less value in seconds.
These two options have to be under the [Service] tag in a service file.
can you ellaborate on how to do this when starting from scratch? using apt-get install system-sysv gets me a «Package ‘systemd-sysv’ has no installation candidate»
Starting from scratch — didnt understand. Linux comes with a system framework component called systemD. Kernel starts this nd once systemD is up, it starts all services on booting of a device. SystemD is a replacement of System V init. is systemD available in your linux platform. If yes then this is just few line changes in service file to get it worked.
nice, I could make that work. I needed to switch from linux 14.04 to 14.10 and then most of useful services already have their unit file under /run/systemd/generator.late
I have used monit monit for this. A post at askfedoraproject suggests to me that this is still a good way to monitor processes and automatically restart them.
It provides good granular configuration of the monitoring functions, how to decide if a process has failed, and actions to be taken to recover it.
Systemctl — System and Service manager for linux systems
Basics about systemd: Features: 1.Parallel startup of system service at boot time 2.On demand activation of daemons 3.Dependecy based service control logic
* limited support at runlevel * panic is not support panic command(systemctl no custom commands) * systemctl can only communicate with services which are started by systemd * sysd stop only running services * system services don't inherit any context like HOME or PATH variable * All services subject to default timeout of 5 minutes can be configured.These prevents from system to freeze in case of some application stop to respond.
Systemd units: service , path, mount, snapshot, swap, timer, device etc Unit Type File Extension Description Service unit .service A system service. Target unit .target A group of systemd units. Automount unit .automount A file system automount point. Device unit .device A device file recognized by the kernel. Mount unit .mount A file system mount point. Path unit .path A file or directory in a file system. Scope unit .scope An externally created process. Slice unit .slice A group of hierarchically organized units that manage system processes. Snapshot unit .snapshot A saved state of the systemd manager. Socket unit .socket An inter-process communication socket. Swap unit .swap A swap device or a swap file. Timer unit .timer A systemd timer.
unit file’s Filelocation: /etc/systemd/system
Conf file: /etc/systemd/system.conf
Systemd provides a lot of functionallity basically you can control all the resouces of linux system that gives you give a lot of functionality.We are focussing on managing system service in this article.
MANAGING SYSTEM SERVICES: systemctl Description systemctl start name.service Starts a service. systemctl stop name.service Stops a service. systemctl restart name.service Restarts a service. systemctl try-restart name.service Restarts a service only if it is running. systemctl reload name.service Reloads configuration. systemctl status name.service systemctl is-active name.service Checks if a service is running. systemctl list-units —type service —all Displays the status of all services. systemctl Description systemctl enable name.service Enables a service. systemctl disable name.service Disables a service. systemctl status name.service systemctl is-enabled name.service Checks if a service is enabled. systemctl list-unit-files —type service Lists all services and checks if they are enabled. systemctl list-dependencies —after Lists services that are ordered to start before the specified unit. systemctl list-dependencies —before Lists services that are ordered to start after the specified unit.