Это старая версия документа!
systemd
https://www.freedesktop.org/software/systemd/man/index.html
Set up self-healing services with systemd
Demystifying Systemd
Unit-файл
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
Это скрипт запуска приложения - как его запускать, под каким пользователем и т. д.
Системные юнит-файлы лежат в /lib/systemd/system
(есть варианты), свои можно создавать в /etc/systemd/system
. Также в /etc/systemd/system
находятся ссылки на системные юнит-файлы, эти ссылки делаются с помощью команды systemctl enable
.
После создания юнит-файла можно управлять запуском приложения - например, добавить в автозагрузку.
Пример unit-файла:
- /etc/systemd/system/multi-user.target.wants/cron.service
[Unit] Description=Regular background program processing daemon Documentation=man:cron(8) After=remote-fs.target nss-user-lookup.target [Service] EnvironmentFile=-/etc/default/cron ExecStart=/usr/sbin/cron -f $EXTRA_OPTS IgnoreSIGPIPE=false KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target
man systemd.unit # Справка по юнитам cat /proc/$(pidof cron)/environ # Вывести переменные процесса cron journalctl -u cron.service -n 10 # Лог (последние 10 записей) journalctl -u cron.service --since yesterday # Лог со вчерашнего дня
Типы юнитов systemd
target # группирует модули service # отвечает за запуск сервисов (служб) и поддерживает вызов интерпретаторов для исполнения пользовательских скриптов mount # занимается монтированием файловых систем automount # автомонтирование файловых систем, используется при обращении к точке монтирования swap # отвечает за подключение файла подкачки timer # запускает модули по расписанию, аналог cron socket # запуск модуля при подключении к сокету slice # группировка других модулей в контейнер (дерево) cgroups device # использует реакцию на подключение какого-либо устройства path # запуск модуля по событию доступа по конкретному пути в файловой системе
Управление процессами systemd
systemctl list-units --type service --all # просмотр всех юнитов в системе systemctl list-unit-files --type service systemctl start name # запустить сервис systemctl stop name # остановить сервис systemctl restart name # перезапустить сервис systemctl status name # посмотреть статус сервиса systemctl reload name # перечитать конфигурацию systemctl daemon-reload # перечитать конфигурацию для всех systemctl try-restart name # перезапустить, если запущен systemctl enable name # включить автозапуск сервиса systemctl disable name # отключить автозапуск сервиса systemctl list-unit-files --type service # список установленных юнит-файлов сервисов
systemd-resolve
Если в /etc/resolv.conf
есть заглушка nameserver 127.0.0.53
, значит, работает сервис systemd-resolve
.
Конфигурация systemd-resolve
находится в /run/systemd/resolve/resolv.conf
. Статус systemd-resolve
можно проверить командой
sudo resolvectl status
Пользовательские юниты
Непривилегированный пользователь тоже может запускать службы systemd от своего имени. Юнит-файлы нужно класть в ~/.config/systemd/user
. Нюанс в том, что эти службы будут работать до тех пор, пока пользователь находится в системе. Если он выходит, то службы останавливаются. Чтобы службы работали вне зависимости от сеанса, нужно выполнить команду
loginctl enable-linger $USER # Проверить, включена ли эта опция loginctl user-status ... Linger: yes
Пример unit-файла
[Unit] Description=Minecraft Java server [Service] WorkingDirectory=/opt/minecraft ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar minecraft.jar nogui Restart=on-failure [Install] WantedBy=multi-user.target
Управление службой такое же, нужно только добавлять параметр --user
.
# После добавления юнита перечитать список демонов systemctl --user daemon-reload
systemd-run
systemd-run позволяет превратить любую команду в фоновую задачу.
unitname=minecraft-server systemd-run --user --unit=$unitname java -Xmx1024M -Xms1024M -jar minecraft.jar nogui systemctl --user status $unitname # Если вы ошиблись в команде или она завершилась с ошибкой systemctl reset-failed
Удаление юнита
systemctl --user stop $unitname find /run -name "*$unitname*" -exec rm -rf {} + 2> /dev/null systemctl --user daemon-reload systemctl --user reset-failed
https://superuser.com/questions/513159/how-to-remove-systemd-services
Поиск
systemctl --user list-units --all -t service --full --no-legend "$unitname.service" |xargs |cut -d' ' -f1
https://stackoverflow.com/questions/24398242/check-if-service-exists-in-bash-centos-and-ubuntu
https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable