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


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 (если я правильно понимаю, не уверен, что понимаю, я новичок в написании начальных скриптов), что мой сервис будет обрабатывать разветвление / демонизацию.

Ответы:


16

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

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.