systemd не выполняет сценарий ExecStop - PullRequest
0 голосов
/ 08 апреля 2020

Я создал сервис (name-development) с использованием systemd. Ниже приводится содержимое моего файла модуля разработки -

Description=Develop Manager Service
[Service]
Type=forking
PIDFile = /home/nayasa/data/var/run/developPid
User=root
Group=root
ExecStartPre = /bin/bash /home/nayasa/control_scripts/develop_startPre.sh
ExecStart =/bin/bash /home/nayasa/control_scripts/develop_start.sh
ExecStop =/bin/bash /home/nayasa/control_scripts/develop_stop.sh
[Install]
WantedBy=multi-user.target

Мой develop.service разветвляется на несколько процессов во время выполнения. Всякий раз, когда я запускаю systemctl stop develop.service, systemd останавливает все процессы в CGroup моей службы разработки, в то время как предоставленный мною сценарий develop_stop , убивающий только основной процесс, использует pid из pidfile. Я хочу остановить только основной процесс. Мне кажется, что systemd не использует мой скрипт остановки. Как заставить systemd выполнить мой скрипт остановки, чтобы остановить службу и не завершать все процессы Cgroup? К вашему сведению, я знаю, что используя опцию KillMode, я могу указать systemd уничтожить только основной процесс и оставить другие процессы, но я хочу знать, почему мой скрипт не выполняется?

1 Ответ

0 голосов
/ 09 апреля 2020

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

Я думаю, что вы, вероятно, хотите сложнее, чем один сервис.

Допустим, вы хотели develop.service для запуска proc1 и proc2. Вы хотите, чтобы systemctl stop develop.service убил proc1, но не proc2. В этом случае вам все еще нужно что-то для управления proc2, в противном случае у вас есть неконтролируемый и неконтролируемый процесс. Ответ заключается в использовании другой службы.

Вместо этого попробуйте создать две службы. develop.service запустит proc1, возможно, используя ваши скрипты. Затем добавьте Wants=proc2.service в свой раздел [Unit]. proc2.service будет нести ответственность за proc2.

Это означает, что systemctl start develop.service запустит proc1 и proc2. Между тем systemctl stop develop.service убьет только proc1. proc2 все еще можно остановить / контролировать, проверив proc2.service.

...