centos - 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 仅杀死主进程并保留其他进程,但我想知道为什么我的脚本没有被执行?
解决方案
在停止服务后期望孤立进程持续存在有点奇怪。您将留下一个处于未知状态的系统。如果您再次启动该服务会发生什么?
我认为您可能想要的比单一服务更复杂。
假设您想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
。
推荐阅读
- linux - 在 Linux 上使用 Cmake add_custom_command 的 Shell 命令
- json - 从 Postgres 和 jOOQ 中的分层表递归生成 JSON 树
- ruby-on-rails - rails 5x问题可以添加没有crud的路线吗?
- pandas - 数据框的累积直方图
- reactjs - 防止在数据更改或正在编辑行时重新排序
- css - R selenium 选择所有带有css的元素,例如_1,_2
- python - 当我尝试将重启功能添加到我的程序 PYTHON 时出错
- javascript - 为什么那个错误是 Uncaught TypeError: Cannot set property 'onclick' of null in my modal?
- python - 如何在 Python 请求中使用现有的 cookie 文件?
- c++ - 在 foreach 循环中将变量声明为 i vs &i