首页 > 解决方案 > systemd 不执行 ExecStop 脚本

问题描述

我使用 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脚本仅使用 pidfile 中的 pid 杀死主进程。我只想停止主进程。在我看来,systemd 没有使用我的停止脚本。如何强制 systemd 执行我的停止脚本以停止服务而不杀死 Cgroup 的所有进程?仅供参考-我知道使用 KillMode 选项我可以指示 systemd 仅杀死主进程并保留其他进程,但我想知道为什么我的脚本没有被执行?

标签: centosredhatsystemd

解决方案


在停止服务后期望孤立进程持续存在有点奇怪。您将留下一个处于未知状态的系统。如果您再次启动该服务会发生什么?

我认为您可能想要的比单一服务更复杂。

假设您想develop.service启动proc1proc2. 你systemctl stop develop.service想杀proc1却不想proc2。在这种情况下,您仍然需要管理一些东西,proc2否则您将拥有一个流氓孤立的不受管理和受监控的进程。答案是使用其他服务。

相反,请尝试制作两项服务。 develop.service将启动proc1,可能使用您的脚本。然后添加Wants=proc2.service到您的[Unit]部分。 proc2.service将负责proc2

这意味着systemctl start develop.service将启动proc1proc2. 同时systemctl stop develop.service只会杀人proc1proc2仍然可以通过检查来停止/监控proc2.service


推荐阅读