Форкинг в системном скрипте

10

Я хочу, чтобы служба systemd обрабатывала разветвление (мой файл сам по себе не обрабатывает разветвление. Поэтому для обработки я полагаюсь на systemd)

Мой файл .service:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Вопрос

Type=forkingДостаточно ли указать , чего я пытаюсь достичь? Или же это похоже на ожидание разветвления в upstart, которое фактически говорит upstart (если я правильно понимаю, не уверен, что понимаю, я новичок в написании начальных скриптов), что мой сервис будет обрабатывать разветвление / демонизацию.

alonisser
источник

Ответы:

16

У systemd отличная документация. Смотрите страницу с сервисными файлами :

Если установлено значение разветвления, ожидается, что процесс, настроенный с помощью ExecStart =, будет вызывать fork () как часть своего запуска. Ожидается, что родительский процесс завершится после завершения запуска и настройки всех каналов связи. Дочерний объект продолжает работать как основной процесс демона. Это поведение традиционных демонов UNIX. Если используется этот параметр, рекомендуется также использовать параметр PIDFile =, чтобы systemd мог определить основной процесс демона. systemd продолжит запуск последующих модулей, как только завершится родительский процесс.

Таким образом, использование этого typeпросто скажет systemd дождаться swampвозврата, а затем посчитать, что он все еще работает: выполнение этого остается вашей обязанностью ...

jasonwryan
источник
5
Если сценарий не выполняет разветвления, это либо oneshot(типичный краткосрочный сценарий), либо simple(длительно работающий сервис, который не выполняет форк + выход).
Павел Шимерда
4
Считаете ли вы сценарий (Bash?), Чтобы раскошелиться другой процесс, когда он фоновый с помощью амперсанда &?
Фелипе Альварес
5
@FelipeAlvarez да, оператор амперсанда в bash эквивалентен форку и exec.
Тейн
1

Если вы хотите, чтобы systemd обрабатывал разветвления, вам следует использовать, например, Type=simpleили Type=notify. Тогда systemd сделает для вас ответвление.

Если вы можете изменить swampисполняемый файл, то Type=notifyэто лучшее решение. Затем исполняемый файл должен уведомить systemd об успешной инициализации. Это означает, что systemctl start swampбудет ждать инициализации swamp при вызове из командной строки и печатать любое сообщение об ошибке при инициализации в командной строке, что обычно требуется.

Для примера исполняемого файла, написанного для использования Type = notify, см. Следующий скрипт:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
user3049102
источник