Как установить PIDFile для systemd, когда основной процесс запускает несколько дочерних и завершает работу? - PullRequest
0 голосов
/ 31 мая 2018

Среда: Ubuntu 16.04, демон, запрограммированный на c, использующий systemd для управления процессами.

Итак, у меня есть файл модуля как:

[Unit]
Description=Fantastic Service
After=network.target

[Service]
Restart=always
Type=forking
ExecStart=/opt/fan/tastic

[Install]
WantedBy=multi-user.target

И в моем коде tastic.c,в основном это fork () X число дочерних элементов, каждый из которых выполняет so_reuseport, а затем завершается основной процесс, оставляя дочерние элементы для обработки запросов.

При вышеуказанной настройке все работает нормально, и я получаю ожидаемое поведение.

Однако, если я помещаю PIDFile в файл сервисного модуля, я получаю, что pid, предоставленный моим приложением, не существует, и это так - поскольку мой основной процесс завершается после запуска запрошенного числа дочерних элементов.

Теперь в документации systemd четко указано, что если вы делаете разветвление Type =, вы должны предоставить PIDFile, но проблема заключается в том, как мне предоставить один файл pid, когда есть несколько дочерних элементов и основнойродительский процесс завершается после запуска childs?

Я что-то упустил?

1 Ответ

0 голосов
/ 31 мая 2018

Как вы обнаружили, система отлично работает без PIDFile= в вашем случае.Документы рекомендуют использовать PIDFile=, но я считаю, что это для случая, когда существует один основной процесс, который не относится к вашему случаю.

Также см. man systemd.kill, который объясняет, как процессы будут убиты.По умолчанию это «control-group», которая убивает «все остальные процессы в контрольной группе».

Так что по умолчанию systemd собирается очистить все эти дочерние процессы во время «остановки» для вас, чего ты хочешь.

Для тех, у кого есть основной процесс, они могут захотеть использовать KillMode=process, и в этом случае настройка PIDFile= может помочь с этим, но это не относится к вашемудело.

...