2016-11-30 10 views
1

У меня есть демонподобный процесс, который запускает два подпроцесса (и один из подпроцессов начинается ~ 10 других). Когда я systemctl stop мой процесс, дочерние подпроцессы кажутся «агрессивно» убитыми systemctl - что не дает моему процессу возможности очистить.systemd `systemctl stop` агрессивно убивает подпроцессы

Как я могу получить systemctl stop, чтобы прекратить агрессивное убийство и, таким образом, позволить моему процессу организовать упорядоченную очистку?

Я пробовал timeoutSec=30 безрезультатно.

+0

Вы рассмотрели документы в 'человек systemd.services' и' человек systemd.kill'? –

ответ

1

KillMode= [1] по умолчанию control-group. Это означает, что каждый процесс вашего сервиса убит с помощью SIGTERM.

У вас есть два варианта:

  • Handle SIGTERM в каждом из ваших процессов и завершения работы в рамках TimeoutStopSec (который по умолчанию 90 секунд [2])
  • Если вы действительно хотите, чтобы делегировать отключение от вашего основного процесс, набор KillMode=mixed. SIGTERM будет отправлен только на основной процесс. Затем снова выключение в пределах TimeoutStopSec. Если вы не остановитесь в пределах TimeoutStopSec, systemd отправит SIGKILL во все ваши процессы.

Примечание: я предлагаю использовать KillMode=mixed в варианте 2 вместо KillMode=process, так как последний будет посылать окончательный SIGKILL только основного процесса, а это значит, ваши подпроцессов не будут убиты, если они заперты ,

[1] https://www.freedesktop.org/software/systemd/man/systemd.kill.html#KillMode=

[2] https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html#DefaultTimeoutStartSec=

 Смежные вопросы

  • Нет связанных вопросов^_^