Большинство дистрибутивов Linux в качестве менеджера системы и сервисов используют systemd.
systemctl является основной командой для управления сервисами в systemd.
В данной статье я покажу, как создать service-файл в systemd, который позволит управлять вашим сервисом с помощью команды systemctl, как без перезагрузки перезапустить systemd, чтобы он перечитал unit-файлы и как активировать ваш новый сервис.
Также я приведу описание наиболее важных опций используемых в service-файлах с примерами реальных service-файлов.
Содержание[Скрыть]
Создание Сервиса в Systemd
Создайте service-файл /etc/systemd/system/foo-daemon.service (замените foo-daemon на имя вашего сервиса):
1 2 |
$ sudo touch /etc/systemd/system/foo-daemon.service $ sudo chmod 664 /etc/systemd/system/foo-daemon.service |
Откройте файл foo-daemon.service и пропишите минимальные настройки, которые позволят управлять сервисом с помощью systemctl:
1 2 3 4 5 6 7 8 |
[Unit] Description=Foo [Service] ExecStart=/usr/sbin/foo-daemon [Install] WantedBy=multi-user.target |
Путь К Демону: Если вы не знаете путь к демону, попробуйте which foo-daemon.
После создания нового service-файла необходимо перезапустить systemd:
1 |
$ sudo systemctl daemon-reload |
Теперь вы можете делать start, stop, restart и проверять status сервиса:
1 2 3 4 |
$ sudo systemctl start foo-daemon $ sudo systemctl stop foo-daemon $ sudo systemctl restart foo-daemon $ systemctl status foo-daemon |
Чтобы добавить сервис в автозагрузку, необходимо активировать его:
1 |
$ sudo systemctl enable foo-daemon |
Чтобы проверить логи сервиса, выполните:
1 |
$ journalctl -u foo-daemon |
Опции Service-файла в Systemd
Service-файла в systemd обычно состоит из трех секций.
Общие элементы конфигурации сервиса настраиваются в секциях [Unit] и [Install]
Параметры конфигурации конкретного сервиса настраиваются в секции [Service].
Важные Опции Секции [Unit]
Опция | Описание |
---|---|
Description | Краткое описание юнита. |
Documentation | Список ссылок на документацию. |
Before, After | Порядок запуска юнитов. |
Requires | Если этот сервис активируется, перечисленные здесь юниты тоже будут активированы. Если один из перечисленных юнитов останавливается или падает, этот сервис тоже будет остановлен. |
Wants | Устанавливает более слабые зависимости, чем Requires. Если один из перечисленных юнитов не может успешно запуститься, это не повлияет на запуск данного сервиса. Это рекомендуемый способ установления зависимостей. |
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 | Настраивает тип запуска процесса. Один из: simple (по умолчанию) — запускает сервис мгновенно. Предполагается, что основной процесс сервиса задан в ExecStart. forking — считает сервис запущенным после того, как родительский процесс создает процесс-потомка, а сам завершится. oneshot — аналогичен типу simple, но предполагается, что процесс должен завершиться до того, как systemd начнет отслеживать состояния юнитов (удобно для скриптов, которые выполняют разовую работу и завершаются). Возможно вы также захотите использовать RemainAfterExit=yes, чтобы systemd продолжал считать сервис активным и после завершения процесса. dbus — аналогичен типу simple, но считает сервис запущенным после того, как основной процесс получает имя на шине D-Bus. notify — аналогичен типу simple, но считает сервис запущенным после того, как он отправляет systemd специальный сигнал. idle — аналогичен типу simple, но фактический запуск исполняемого файла сервиса откладывается, пока не будут выполнены все задачи. |
ExecStart | Команды вместе с аргументами, которые будут выполнены при старте сервиса. Опция Type=oneshot позволяет указывать несколько команд, которые будут выполняться последовательно. Опции ExecStartPre и ExecStartPost могут задавать дополнительные команды, которые будут выполнены до или после ExecStart. |
ExecStop | Команды, которые будут выполнены для остановки сервиса запущенного с помощью ExecStart. |
ExecReload | Команды, которые будут выполнены чтобы сообщить сервису о необходимости перечитать конфигурационные файлы. |
Restart | Если эта опция активирована, сервис будет перезапущен если процесс прекращен или достигнут timeout, за исключением случая нормальной остановки сервиса с помощью команды systemctl stop |
RemainAfterExit | Если установлена в значение True, сервис будет считаться запущенным даже если сам процесс завершен. Полезен с Type=oneshot. Значение по умолчанию False. |
Список всех опций секции [Service]:
1 |
$ man systemd.service |
Примеры 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.
Ваш комментарий будет первым