У меня есть системный сервис

[Unit]
Description=dynsock server
After=network.target

[Service]
EnvironmentFile=/etc/dynsock.env
ExecStart=/usr/local/bin/dynctl.sh $SERVER $COUNT $BASEPORT $AUTH
ExecStop=/usr/local/bin/dynsock_onfailure.sh down
Restart=always
Type=forking

[Install]
Alias=dynsock.service

dynctl.sh запустит дочерний процесс $count . Я надеюсь, что когда какой-нибудь процесс завершится, systemctl будет перезагружен, и ExecStop . Но система будет перезагружаться только до тех пор, пока все дочерние процессы не прекратятся.

1 ответ1

1

systemctl не может знать, как работает dynctl.sh чтобы он мог знать, сколько дочерних процессов должно быть живо в данный момент времени. Вот почему вы должны управлять жизненным циклом процессов, чтобы после смерти одного дочернего процесса служба была перезапущена.

Я предлагаю использовать основной процесс в качестве master для других, чтобы с помощью grep или pgrep он мог определить, все ли дочерние процессы живы, а если нет, то systemctl restart <your service> .

Ура, надеюсь, это поможет

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .