Большинство дистрибутивов Linux используют systemd в качестве менеджера систем и сервисов.
systemctl - это основная команда в systemd, используемая для управления службами.
В этом руководстве я покажу, как создать файл службы systemd, который позволит вам управлять службой с помощью команды systemctl, как перезапустить systemd без перезагрузки для перезагрузки файлов модулей и как включить вашу новую службу.
Я также покажу и опишу наиболее важные опции сервисного файла systemd на живых примерах сервисных файлов systemd.
Создание файла службы Systemd
Создайте файл службы systemd /etc/systemd/system/test-daemon.service (замените test-daemon на имя вашей службы):
1 2 | sudo touch /etc/systemd/system/test-daemon.service sudo chmod 664 /etc/systemd/system/test-daemon.service |
Откройте файл test-daemon.service и добавьте минимальные параметры конфигурации сервиса, которые позволяют управлять этим сервисом через systemctl:
1 2 3 4 5 6 7 8 | [Unit] Description=Test [Service] ExecStart=/usr/sbin/test-daemon [Install] WantedBy=multi-user.target |
Путь к демону: Если вы не знаете полный путь к демону, попробуйте использовать test-daemon.
После изменения служебного файла необходимо перезагрузить конфигурацию systemd:
1 | sudo systemctl daemon-reload |
Теперь вы должны иметь возможность запускать, останавливать, перезапускать и проверять состояние службы
1 2 3 4 | sudo systemctl start test-daemon sudo systemctl stop test-daemon sudo systemctl restart test-daemon systemctl status test-daemon |
Чтобы настроить службу на автоматический запуск при загрузке, необходимо включить ее:
1 | sudo systemctl enable test-daemon |
Чтобы проверить журналы службы, выполните:
1 | journalctl -u test-daemon |
Параметры служебного файла Systemd
Служебные файлы Systemd обычно состоят из трех разделов.
Общие элементы конфигурации настраиваются в общих разделах [Unit] и [Install].
Параметры конфигурации конкретной службы настраиваются в разделе [Service].
Важные параметры секции [Unit]
Опция | Описание |
Description | Краткое описание демона |
Documentation | Список URI, ссылающихся на документацию. |
Before, After | Порядок, в котором запускаются подразделения. |
Requires | Если это подразделение активируется, то будут активированы и перечисленные здесь подразделения. Если один из других блоков деактивируется или не работает, этот блок будет деактивирован. |
Wants | Настраивает более слабые зависимости, чем Requires. Если какое-либо из перечисленных устройств не запускается успешно, это не влияет на активацию устройства. Это рекомендуемый способ установки пользовательских зависимостей между подразделениями. |
Conflicts | Если у одного блока есть настройка Conflicts для другого блока, запуск первого остановит второй, и наоборот. |
Полный список опций раздела [Unit]:
1 | man systemd.unit |
Важные параметры раздела [Install]
Опции | Описание |
Alias | Список дополнительных имен для устройства, разделенных пробелами. Большинство команд systemctl, за исключением systemctl enable, могут использовать псевдонимы вместо фактического имени устройства. |
RequiredBy, WantedBy | Текущая служба будет запущена, когда будут запущены перечисленные службы. Подробности см. в описании Wants и Requires в разделе [Unit]. |
Also | Указывает список устройств, которые будут включены или отключены вместе с данным устройством, когда пользователь запускает systemctl enable или systemctl disable. |
Полный список опций раздела [Install]:
1 | man systemd.unit |
Важные опции раздела [Service]
Опция | Описание |
Type | Настраивает тип запуска процесса. Один из: простой (по умолчанию) - запускает службу немедленно. Предполагается, что главный процесс службы определен в ExecStart. forking - считает, что служба запущена, как только процесс forks и родительский процесс завершился. oneshot - аналогичен простому, но предполагается, что процесс должен завершиться до того, как systemd запустит последующие блоки (полезно для сценариев, которые выполняют одно задание и затем завершаются). Вы можете установить RemainAfterExit=yes, чтобы systemd считал службу активной после завершения процесса. dbus - аналогично simple, но считает, что служба запущена, когда основной процесс получает имя D-Bus. notify - аналогично простому, но служба считается запущенной только после отправки специального сигнала в systemd. idle - аналогично simple, но фактическое выполнение бинарного файла службы откладывается до тех пор, пока все задания не будут завершены. |
ExecStart | Команды с аргументами для выполнения при запуске службы. Type=oneshot позволяет указать несколько пользовательских команд, которые затем выполняются последовательно. ExecStartPre и ExecStartPost задают пользовательские команды, которые будут выполняться до и после ExecStart. |
ExecStop | Команды, которые необходимо выполнить для остановки службы, запущенной через ExecStart. |
ExecReload | Команды, которые необходимо выполнить, чтобы вызвать перезагрузку конфигурации в службе. |
Restart | Если эта опция включена, служба будет перезапущена, когда процесс службы завершается, убивается или достигается таймаут, за исключением обычной остановки командой systemctl stop. |
RemainAfterExit | Если установлено значение True, служба считается активной, даже если все ее процессы завершились. Используется при Type=oneshot. Значение по умолчанию - False. |
Полный список опций раздела [Service]:
1 | man systemd.service |
Примеры файлов служб Systemd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [Unit] Description=The NGINX HTTP and reverse proxy server After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target |
1 2 3 4 5 6 7 8 9 10 11 12 | [Unit] Description=Redis persistent key-value database After=network.target [Service] ExecStart=/usr/bin/redis-server /etc/redis.conf --daemonize no ExecStop=/usr/bin/redis-shutdown User=redis Group=redis [Install] WantedBy=multi-user.target |
Дополнительные примеры можно найти на страницах руководства systemd.service и systemd.unit.