背景
我被要求systemd
为新服务创建脚本,该脚本foo_daemon
有时会进入“不良状态”,并且不会通过SIGTERM
(可能由于自定义信号处理程序而)消失。这对开发人员来说是个问题,因为他们被指示通过以下方式启动/停止/重新启动服务:
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
问题
有时,由于foo_daemon
进入不良状态,我们必须通过以下方式强行杀死它:
systemctl kill -s KILL foo_daemon.service
题
我如何设置我的systemd
脚本,foo_daemon
以便每当用户尝试停止/重新启动服务时,systemd
都会:
- 尝试正常关闭
foo_daemon
viaSIGTERM
。 - 最多需要2秒
foo_daemon
才能完成关机/终止操作。 - 如果该进程仍然存在,请尝试强制关闭
foo_daemon
viaSIGKILL
(这样我们就不会有PID被回收的风险,也不会出现针对错误PID的systemd
问题SIGKILL
)。我们正在测试的设备迅速产生/分叉了许多过程,因此,对于PID回收引起问题的问题很少,但确实存在。 - 如果实际上,我只是对PID回收抱有偏执,那么我可以接受脚本,只是
SIGKILL
针对进程的PID 发出脚本,而不必担心杀死回收的PID。
2
即使您快速生成进程以在两秒钟内滚动超过400万个PID,systemd 也不会循环检查“此pid仍然有效吗?此pid仍然有效吗?”。因为它并不需要到; 它已经被告知其直接子进程是否仍然有效(通过普通的SIGCHLD和waitpid())。因此,如果发现该进程在SIGTERM之后退出,那么它将在该点将服务标记为“非活动”,这完全不会打扰检查,等待和发送SIGKILL。
—
grawity