os:linux:systemd
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
os:linux:systemd [19.11.2024 20:26] – [systemd-run] viacheslav | os:linux:systemd [30.04.2025 10:57] (текущий) – [Минимальный вариант] viacheslav | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== systemd ====== | ||
+ | https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | {{ : | ||
+ | [[https:// | ||
+ | ===== Unit-файл ===== | ||
+ | https:// | ||
+ | |||
+ | Это скрипт запуска приложения - как его запускать, | ||
+ | Системные юнит-файлы лежат в ''/ | ||
+ | После создания юнит-файла можно управлять запуском приложения - например, | ||
+ | |||
+ | Пример unit-файла: | ||
+ | <file bash / | ||
+ | [Unit] | ||
+ | Description=OpenSSH server daemon | ||
+ | Documentation=man: | ||
+ | # After - запускать после network.target и sshd-keygen.service | ||
+ | After=network.target sshd-keygen.service | ||
+ | # Wants - слабая зависимость: | ||
+ | Wants=sshd-keygen.service | ||
+ | |||
+ | [Service] | ||
+ | EnvironmentFile=/ | ||
+ | ExecStart=/ | ||
+ | ExecReload=/ | ||
+ | KillMode=process # Как systemd будет останавливать сервис. Здесь: остановить только основной процесс, | ||
+ | Restart=on-failure # Перезапуск сервиса при сбое | ||
+ | RestartSec=42s # Через сколько перезапускать | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target # Работать под runlevel multi-user | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | <code bash> | ||
+ | man systemd.unit # Справка по юнитам | ||
+ | cat / | ||
+ | journalctl -u cron.service -n 10 # Лог (последние 10 записей) | ||
+ | journalctl -u cron.service --since yesterday # Лог со вчерашнего дня | ||
+ | </ | ||
+ | |||
+ | Типы юнитов systemd | ||
+ | <code bash> | ||
+ | target # группирует модули | ||
+ | service # отвечает за запуск сервисов (служб) и поддерживает вызов интерпретаторов для исполнения пользовательских скриптов | ||
+ | mount # занимается монтированием файловых систем | ||
+ | automount # автомонтирование файловых систем, | ||
+ | swap # отвечает за подключение файла подкачки | ||
+ | timer # запускает модули по расписанию, | ||
+ | socket # запуск модуля при подключении к сокету | ||
+ | slice # группировка других модулей в контейнер (дерево) cgroups | ||
+ | device # использует реакцию на подключение какого-либо устройства | ||
+ | path # запуск модуля по событию доступа по конкретному пути в файловой системе | ||
+ | </ | ||
+ | |||
+ | Управление процессами systemd | ||
+ | <code bash> | ||
+ | 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 # список установленных юнит-файлов сервисов | ||
+ | </ | ||
+ | |||
+ | ==== Создать юнит ==== | ||
+ | <code bash> | ||
+ | # Создание пользовательского сервиса и таймера (каталог ~/ | ||
+ | systemctl edit myservice --user --full --force | ||
+ | systemctl edit myservice.timer --user --full --force | ||
+ | |||
+ | # Создание системного сервиса и таймера (каталог / | ||
+ | sudo systemctl edit myservice --full --force | ||
+ | sudo systemctl edit myservice.timer --full --force | ||
+ | </ | ||
+ | После '' | ||
+ | ==== Зависимость между юнитами и порядок запуска ==== | ||
+ | Перед запуском юнит может '' | ||
+ | * Если unit1 '' | ||
+ | * Если unit1 '' | ||
+ | |||
+ | Для чего нужен '' | ||
+ | |||
+ | '' | ||
+ | * Если в unit1 есть параметр '' | ||
+ | * Если в unit1 есть параметр '' | ||
+ | |||
+ | В примере sshd.service запустится только после того, как поднялась сеть и запустился sshd-keygen. | ||
+ | <code ini> | ||
+ | Wants=sshd-keygen.service | ||
+ | After=network.target sshd-keygen.service | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | |||
+ | ==== Target unit ==== | ||
+ | Используется для связи и группировки других юнитов вместе, | ||
+ | |||
+ | В примере нет выполняемой команды, | ||
+ | <file ini multi-user.target> | ||
+ | [Unit] | ||
+ | Description=Multi-User System | ||
+ | Documentation=man: | ||
+ | Requires=basic.target | ||
+ | Conflicts=rescue.service rescue.target | ||
+ | After=basic.target rescue.service rescue.target | ||
+ | AllowIsolate=yes | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * Если '' | ||
+ | * Если '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | Таргет может иметь каталог '' | ||
+ | ===== systemd-resolve ===== | ||
+ | Если в ''/ | ||
+ | |||
+ | Конфигурация '' | ||
+ | <code bash> | ||
+ | sudo resolvectl status | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | |||
+ | ===== Пользовательские юниты ===== | ||
+ | Непривилегированный пользователь тоже может запускать службы systemd от своего имени. Юнит-файлы нужно класть в '' | ||
+ | <code bash> | ||
+ | loginctl enable-linger $USER | ||
+ | |||
+ | # Проверить, | ||
+ | loginctl user-status | ||
+ | ... | ||
+ | Linger: yes | ||
+ | |||
+ | # или показать только yes/no | ||
+ | loginctl show-user $USER -p Linger |cut -d= -f2 | ||
+ | </ | ||
+ | |||
+ | Пример unit-файла | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Minecraft Java server | ||
+ | |||
+ | [Service] | ||
+ | WorkingDirectory=/ | ||
+ | ExecStart=/ | ||
+ | Restart=on-failure | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </ | ||
+ | |||
+ | Управление службой такое же, нужно только добавлять | ||
+ | <code bash> | ||
+ | # После добавления юнита перечитать список демонов | ||
+ | systemctl --user daemon-reload | ||
+ | </ | ||
+ | |||
+ | ===== systemd-run ===== | ||
+ | systemd-run позволяет превратить любую команду в фоновую задачу. | ||
+ | <code bash> | ||
+ | unitname=minecraft-server | ||
+ | systemd-run --user --unit=$unitname java -Xmx1024M -Xms1024M -jar minecraft.jar nogui | ||
+ | systemctl --user status $unitname | ||
+ | |||
+ | # Если вы ошиблись в команде или она завершилась с ошибкой | ||
+ | systemctl reset-failed | ||
+ | </ | ||
+ | |||
+ | Удаление юнита | ||
+ | <code bash> | ||
+ | systemctl --user stop $unitname | ||
+ | find /run -name " | ||
+ | systemctl --user daemon-reload | ||
+ | systemctl --user reset-failed | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | Поиск | ||
+ | <code bash> | ||
+ | systemctl --user list-units --all -t service --full --no-legend " | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Псевдосервис и получение его статуса для скриптов | ||
+ | <code bash> | ||
+ | systemd-run --user --unit=camunda sleep infinity | ||
+ | Running as unit: camunda.service | ||
+ | |||
+ | systemctl --user is-active camunda.service | ||
+ | active # or inactive | ||
+ | </ | ||
+ | ===== systemd.timer ===== | ||
+ | |||
+ | Сервис типа oneshot, запускающий скрипт | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Testlog service | ||
+ | # | ||
+ | |||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | ExecStart=/ | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </ | ||
+ | |||
+ | Таймер запуска каждые 3 минуты | ||
+ | <code ini> | ||
+ | [Unit] | ||
+ | Description=Testlog timer | ||
+ | # | ||
+ | |||
+ | [Timer] | ||
+ | # | ||
+ | OnCalendar=*: | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Для работы нужно 3 компонента: | ||
+ | Скрипт после создания нужно сделать исполняемым - '' | ||
+ | |||
+ | <code bash> | ||
+ | vi / | ||
+ | # Абсолютный минимум для сервиса: | ||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | |||
+ | # Вариант создания | ||
+ | systemctl edit --force --full test.service | ||
+ | # Вариант редактирования | ||
+ | systemctl edit --full test.service | ||
+ | |||
+ | # Перечитать список сервисов (если редактировалось/ | ||
+ | sudo systemctl daemon-reload | ||
+ | # Можно запускать | ||
+ | systemctl start test.service | ||
+ | |||
+ | # Логи сервиса test в реальном времени | ||
+ | sudo journalctl -u test -f | ||
+ | </ | ||
+ | |||
+ | Другие секции конфигурации сервиса | ||
+ | <code bash> | ||
+ | [Unit] | ||
+ | Description=This service runs the script / | ||
+ | |||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | User=worker # от имени кого будет работать | ||
+ | |||
+ | # Если служба запускается по таймеру, | ||
+ | #[Install] | ||
+ | # | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Таймер | ||
+ | <code bash> | ||
+ | # Кладётся в ту же папку, что и сервис | ||
+ | vi / | ||
+ | |||
+ | [Unit] | ||
+ | Description=This timer starts test.service | ||
+ | |||
+ | [Timer] | ||
+ | Unit=test.service | ||
+ | # [DayOfWeek] Year-Month-Day Hour: | ||
+ | OnCalendar=*-*-* 20:15:00 | ||
+ | Persistent=true # Если срабатывание пропущено, | ||
+ | # | ||
+ | |||
+ | # Секция нужна для того, чтобы таймер можно было бы включить при загрузке системы | ||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
+ | |||
+ | # Перечитать сервисы | ||
+ | sudo systemctl daemon-reload | ||
+ | # Включить таймер при загрузке системы | ||
+ | sudo systemctl enable test.timer | ||
+ | |||
+ | # Список таймеров | ||
+ | systemctl list-timers | ||
+ | </ | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | ==== Минимальный вариант ==== | ||
+ | <code bash> | ||
+ | mkdir -p ~/ | ||
+ | cd ~/ | ||
+ | loginctl enable-linger $USER | ||
+ | |||
+ | ### cleanup.service | ||
+ | [Service] | ||
+ | ExecStart=/ | ||
+ | |||
+ | ### cleanup.timer | ||
+ | # Секция [Install] нужна для автозагрузки таймера | ||
+ | [Timer] | ||
+ | OnCalendar=*-*-* 2:00:00 | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
+ | |||
+ | # Шебанг в скрипте обязателен, | ||
+ | ### / | ||
+ | #!/bin/bash | ||
+ | |||
+ | find / | ||
+ | find / | ||
+ | find / | ||
+ | |||
+ | ### Запуск, | ||
+ | systemctl --user daemon-reload | ||
+ | systemctl --user start cleanup.timer | ||
+ | systemctl --user enable cleanup.timer | ||
+ | </ | ||
+ | |||
+ | ==== Срабатывание чаще минуты ==== | ||
+ | |||
+ | Например, | ||
+ | <code bash> | ||
+ | [Timer] | ||
+ | # Каждые 3 минуты | ||
+ | # OnCalendar=*: | ||
+ | # Каждые 10 сек | ||
+ | OnCalendar=*: | ||
+ | # Обязательный параметр для таймеров меньше минуты | ||
+ | AccuracySec=1s | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=timers.target | ||
+ | </ | ||