О чем статья?
- Что такое 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
может использоваться в командах enable
, disable
и 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