Инструменты пользователя

Инструменты сайта


flip:linux:systemd

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
flip:linux:systemd [2025/03/26 18:51] – создано flipflip:linux:systemd [2025/03/31 15:17] (текущий) flip
Строка 5: Строка 5:
 Каталог с конфигурациями: ''/etc/systemd/system/'' \\ Каталог с конфигурациями: ''/etc/systemd/system/'' \\
 Пример: ''myservice.service'' Пример: ''myservice.service''
 +
 +
 +===== Проверить синтаксис =====
 +
 +<code>
 +systemd-analyze verify /etc/systemd/system/myservice.service
 +</code>
  
  
Строка 20: Строка 27:
 </code> </code>
  
-Отключить+ 
 +==== Отключить ====
  
 <code> <code>
-systemctl disable myservis+systemctl disable myservice
 </code> </code>
  
  
-===== Параметры =====+===== Настройка =====
  
-==== Ключи времени ====+==== Основные параметры [Unit] ====
  
-  * **Wants** - Ожидает +(Общие для всех типов unit-файлов)
-  * **Requires** - Требует +
-  * **Before** - Перед +
-  * **After** - После +
-  * **WantedBy** - Ожидается цель/служба +
-  * **RequiresBy** - Требуется цель/служба+
  
 +<code>
 +[Unit]
 +Description=Описание сервиса
 +Documentation=URL или man-страница
 +After=network.target           # Запускать после этих юнитов
 +Before=some.target             # Запускать перед этими юнитами
 +Requires=postgresql.service    # Жёсткая зависимость (если postgresql не запустится, этот сервис тоже не запустится)
 +Wants=redis.service            # Мягкая зависимость (сервис попытается запустить redis, но не зависит от его успеха)
 +Conflicts=old_service.service  # Сервис не может работать одновременно с old_service
 +</code>
  
-==== Параметры перезапуска службы ==== 
  
-  * **no** - никогда +==== Параметры [Service] ====
-  * **always** - всегда +
-  * **on-success** - успешно +
-  * **on-failure** - не успешно +
-  * **on-abnormal** - не нормальный +
-  * **on-abort** - при прирывании +
-  * **on-watchdog** - Сторожевой таймер (Watchdog timer) — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы.+
  
-^ Restart settings/Exit causes ^ no ^ always ^ on-success ^ on-failure ^ on-abnormal ^ on-abort ^ on-watchdog ^ +(Специфичные для сервисов)
-| Clean exit code or signal \\ Корректый код выхода или сигнал |  | X | X |  |  |  |  | +
-| Unclean exit code \\ Неккоректный код выхода |  | X |  | X |  |  |  | +
-| Unclean signal \\ Некорректный сигнал |  | X |  | X | X | X |  | +
-| Timeout |  | X |  | X | X |  |  | +
-| Watchdog \\ Сторожевой таймер |  | X |  | X | X |  | X |+
  
 +=== Тип сервиса ===
  
-==== Список целей ====+<code> 
 +Type=simple           # Простой запуск (по умолчанию). systemd считает сервис активным сразу после fork. 
 +Type=forking          # Для демонов, которые сами форкаются (нужен PIDFile=
 +Type=oneshot          # Для скриптов, которые завершаются (с Optional ExecStop=) 
 +Type=notify           # Сервис уведомит systemd о готовности (через sd_notify) 
 +Type=idle             # Запустится, когда система простаивает 
 +Type=dbus             # Активируется при появлении D-Bus имени 
 +Type=exec             # Как simple, но ждёт завершения ExecStartперед запуском других юнитов 
 +</code>
  
-  * **default.target** - модуль по-умолчанию +=== Команды === 
-  * **graphical.target** - запуск графической подсистемы + 
-  * **multi-user.target** - запуск консоли +<code> 
-  * **network-online.target** - ожидание подключенной сети (используется в Wants) +ExecStart=/path/to/bin arg1 arg2  # Основная команда 
-  * **network.target** - сеть +ExecStartPre=/bin/pre-script.sh   # Подготовка перед ExecStart 
-  * **network-pre.target** - запуск до настройки сети (используется в Requires+ExecStartPost=/bin/after-start.sh # Действия после успешного старта 
-  * **boot-complete.target** - успешная загрузка+ExecReload=/bin/reload-script     # Команда для systemctl reload 
 +ExecStop=/bin/cleanup.sh          # Команда для остановки 
 +ExecStopPost=/bin/after-stop.sh   # Действия после остановки 
 +</code> 
 + 
 +=== Управление процессом === 
 + 
 +<code> 
 +User=nobody                       # От имени какого пользователя запускать 
 +Group=nogroup                     # Группа процесса 
 +WorkingDirectory=/path/to/dir     # Рабочая директория 
 +Environment="VAR1=value"          # Переменные окружения 
 +EnvironmentFile=/etc/conf.d/myenv # Файл с переменными (как source в bash) 
 +PIDFile=/run/service.pid          # Для Type=forking (указывает на файл с PID) 
 +UMask=0022                        # Маска прав для файлов 
 +Nice=-10                          # Приоритет процесса (от -20 до 19) 
 +OOMScoreAdjust=-500               # Защита от OOM-killer (меньше – реже убивается) 
 +</code> 
 + 
 +=== Рестарт и таймауты === 
 + 
 +<code> 
 +Restart=no              # Не перезапускать (по умолчанию) 
 +Restart=on-success      # Только при успешном завершении (код 0) 
 +Restart=on-failure      # При ошибке (ненулевой код или сигнал) 
 +Restart=on-abnormal     # При нестандартном завершении (сигнал) 
 +Restart=on-watchdog     # При зависании (по watchdog) 
 +Restart=always          # Перезапускать всегда, даже при ручном stop 
 +RestartSec=5s           # Пауза перед рестартом (по умолчанию 100ms) 
 +TimeoutStartSec=30s     # Максимальное время запуска 
 +TimeoutStopSec=10s      # Максимальное время остановки 
 +TimeoutSec=30s          # Общий таймаут для старта/останова 
 +RuntimeMaxSec=1h        # Максимальное время работы сервиса 
 +</code> 
 + 
 +=== Лимиты === 
 + 
 +<code> 
 +LimitNOFILE=65536       # Максчисло открытых файлов 
 +LimitNPROC=512          # Макс. число процессов 
 +LimitCORE=infinity      # Макс. размер core-файла 
 +MemoryLimit=2G          # Лимит оперативной памяти 
 +CPUQuota=150%           # Лимит CPU (может быть >100% для многопоточности) 
 +</code> 
 + 
 +=== Дополнительно === 
 + 
 +<code> 
 +StandardOutput=journal  # Куда писать stdout (journal, syslog, file:/path) 
 +StandardError=inherit   # Куда писать stderr (inherit – как stdout) 
 +SyslogIdentifier=myapp  # Метка в журнале (по умолчанию – имя сервиса) 
 +KillMode=process        # Что убивать при остановке (process, mixed, control-group) 
 +RemainAfterExit=yes     # Считать сервис активным после завершения (для oneshot) 
 +SuccessExitStatus=143   # Какие коды считать успешными (помимо 0) 
 +</code> 
 + 
 + 
 +==== Секция [Install] ==== 
 + 
 +(Для ''systemctl enable''
 + 
 +<code> 
 +[Install] 
 +WantedBy=multi-user.target  # В какой target добавить сервис 
 +Alias=myservice.alias       # Альтернативное имя для сервиса 
 +RequiredBy=other.target     # Обратная зависимость 
 +Also=other.service          # Дополнительные юниты для включения/выключения 
 +</code>
  
  
Строка 92: Строка 169:
 # здесь используется ключи времени с указанием цели или другой службы # здесь используется ключи времени с указанием цели или другой службы
 WantedBy=graphical.target WantedBy=graphical.target
 +</code>
 +
 +
 +===== Создание пользовательской службы =====
 +
 +  * Пользовательские сервисы работают с ключом ''<nowiki>--user</nowiki>''
 +  * Они выполняются с правами текущего пользователя
 +  * Для некоторых операций (например, работы с сетью) могут потребоваться дополнительные разрешения
 +  * Логи можно просматривать через ''<nowiki>journalctl --user -u myservice.service</nowiki>''
 +
 +==== Создание структуры каталогов ====
 +
 +Сначала создайте необходимые каталоги в вашей домашней директории
 +
 +<code>
 +mkdir -p ~/.config/systemd/user/
 +</code>
 +
 +
 +==== Создание unit-файла ====
 +
 +
 +Создайте файл сервиса в этом каталоге, например ''myservice.service''
 +
 +<code>
 +nano ~/.config/systemd/user/myservice.service
 +</code>
 +
 +
 +==== Активация пользовательского менеджера systemd ====
 +
 +Перед использованием убедитесь, что пользовательский менеджер systemd запущен
 +
 +<code>
 +systemctl --user enable --now dbus.service
 +</code>
 +
 +
 +==== Управление сервисом ====
 +
 +<code>
 +# Перечитать конфигурации
 +systemctl --user daemon-reload
 +
 +# Включить автозагрузку сервиса
 +systemctl --user enable myservice.service
 +
 +# Запустить сервис
 +systemctl --user start myservice.service
 +
 +# Проверить статус
 +systemctl --user status myservice.service
 +
 +# Остановить сервис
 +systemctl --user stop myservice.service
 +
 +# Отключить автозагрузку
 +systemctl --user disable myservice.service
 +</code>
 +
 +
 +==== Автозапуск при входе пользователя ====
 +
 +По умолчанию пользовательские сервисы не запускаются при загрузке системы, а только при входе пользователя.
 +
 +Для включения постоянной работы
 +
 +<code>
 +sudo loginctl enable-linger username
 </code> </code>
  
  
  
flip/linux/systemd.1743015109.txt.gz · Последнее изменение: 2025/03/26 18:51 — flip

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki