systemd

О чем статья?

  • Что такое systemd?
  • Команды systemctl для управления systemd
  • Как запустить программу в автозагрузке
  • Как создать свой юнит файл

В современных Linux-системах systemd выполняет роль сервисного слоя, диспетчера системы и служб. Главная команда для мониторинга и управления systemd — systemctl

Анализ состояния системы

Показать состояние системы. Параметр --type=service позволяет отобразить юниты, запущенные как сервисы:

$ systemctl status
$ systemctl list-units
$ systemctl list-units --type=service

Вывести список юнит файлов

$ systemctl list-unit-files

Вывести список юнитов с проблемами:

$ systemctl --failed

Список установленных файлов юнитов можно узнать командой:

$ systemctl list-unit-files

Основные команды управления systemd

Перезагрузить менеджер настроек systemd, просканировав систему на наличие новых или изменённых юнитов:

$ systemctl daemon-reload

Запуск, перезагрузка, остановка, проверка статуса юнита:

$ systemctl start юнит
$ systemctl restart юнит
$ systemctl stop юнит
$ systemctl status юнит

Проверить, добавлен ли юнит в автозагрузку:

$ systemctl is-enabled юнит

Добавить юнит в автозагрузку, добавить и сразу запустить, удалить из автозагрузки:

$ systemctl enable юнит
$ systemctl enable --now юнит
$ systemctl disable юнит

Опция --now может использоваться в командах enabledisable и mask, чтобы соответственно запустить, остановить или маскировать указанный юнит сразу при выполнении команды, а не после перезагрузки

Маскировать юнит и снять маскировку. Если юнит маскирован, то запуск юнита становится невозможным

$ systemctl mask юнит
$ systemctl unmask юнит

Управление питанием

Команды завершения работы и перезагрузки, выключения, перехода в ждущий режим, спящий режим и режим гибридного сна

$ systemctl reboot
$ systemctl poweroff
$ systemctl suspend
$ systemctl hibernate
$ systemctl hybrid-sleep

Работа с юнит файлами

Файлы юнитов находятся в каталогах:

  • /usr/lib/systemd/system/ – юниты, созданные при установке пакетов
  • /etc/systemd/system/ – юниты, созданные администратором
  • /run/systemd/system/ — юниты, созданные в рантайме 

Вывести полный список каталогов с расположением юнит файлов можно командой:

$ systemctl show --property=UnitPath

Посмотреть содержимое юнит файла:

$ systemctl cat юнит

Создавать и редактировать юнит файлы можно любым текстовым редактором, однако это может привести к конфликтам с pacman. Для просмотра и редактирования юнит файлов есть специальные команды:

$ systemctl edit --force юнит   # создать новый файл сервиса
$ systemctl edit --full юнит    # редактировать файл сервиса

Эта команда откроет на редактирование юнит файл (или создаст новый пустой юнит файл если его нет) и перезагрузит его после окончания редактирования.

Чтобы отменить все изменения, сделанные с помощью systemctl edit, воспользуйтесь командой:

$ systemctl revert юнит

Пример простого unit файла:

# Секция описания юнита
[Unit] 
# Название юнита
Description=MyUnit 
# Порядок загрузки юнита
After=syslog.target 
After=network.target 
After=nginx.service 
After=mysql.service 
Requires=mysql.service 
Wants=redis.service 

# Секция, описывающая запуск юнита
[Service] 
# Тип сервиса. Бывает 
# Type=simple (по умолчанию) - означает немедленный запуск, процесс не разветвляется, очередность не учитывается
# Type=forking - однократный запуск с разветвлением при завершении родительского процесса, применяется для запуска классических демонов
Type=forking 
# Файл по которому система будет отслеживать процесс
PIDFile=/work/www/myunit/shared/tmp/pids/service.pid 
# Рабочий каталог
WorkingDirectory=/work/www/myunit/current 

# Пользователь и группа от имени которых запускается сервис
User=myunit 
Group=myunit 

# Переменные окружения
Environment=RACK_ENV=production 

# Запрет на убийство сервиса вследствие нехватки памяти и срабатывания механизма OOM:
# -1000 полный запрет (такой у sshd стоит), -100 понизим вероятность
OOMScoreAdjust=-100 

# Команды запуска, остановки и перезапуска сервиса:
ExecStart=/usr/local/bin/bundle exec service -C /work/www/myunit/shared/config/service.rb --daemon 
ExecStop=/usr/local/bin/bundle exec service -S /work/www/myunit/shared/tmp/pids/service.state stop 
ExecReload=/usr/local/bin/bundle exec service -S /work/www/myunit/shared/tmp/pids/service.state restart 
# Таймаут в секундах на ожидание выполнения команд запуска, остановки и перезапуска сервиса:
TimeoutSec=300 
# Автоматический рестарт сервиса
Restart=always

# Секция, описывающая уровни запуска юнита
[Install] 
# Уровень запуска:
# WantedBy=multi-user.target - многопользовательский режим без графики
# WantedBy=graphical.target - многопользовательский режим с графикой
WantedBy=multi-user.target 

В блоке [Install] описаны уровни запуска или цели. Посмотреть и изменить текущие цели в системе можно командами:

$ systemctl list-units --type=target
$ systemctl isolate graphical.target

Посмотреть текущую цель можно командой

systemctl get-default

Добавить комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

Отправить