首页 >后端开发 >Golang >如何确保子进程在 systemd 中的父进程终止后继续存在?

如何确保子进程在 systemd 中的父进程终止后继续存在?

Susan Sarandon
Susan Sarandon原创
2024-12-25 08:24:10611浏览

How to Ensure Child Processes Survive Parent Process Termination in systemd?

在 Systemd 中分离子进程

执行生成长时间运行的子进程的程序时,确保子进程即使在主进程结束后仍保持活动状态至关重要进程重新启动或终止。使用命令行,这可以通过将 exec.Command 对象的 Setsid 标志设置为 true 来实现。这会将子进程与父进程的会话和进程组分离,使其继续独立运行。

但是,当通过 systemd 启动主进程时,服务配置文件中的默认 KillMode 设置可能会干扰脱离过程。默认情况下,systemd 的 KillMode 设置为 control-group,这意味着当主进程停止时,单元控制组内的所有进程都会终止。

解决此问题并允许子进程在主进程中存活终止时,需要修改 systemd 服务文件中的 KillMode 设置。

修改 Systemd 服务文件

要更改 KillMode 设置,请编辑位于 /etc/systemd/system/exectest.service 的 systemd 服务文件,并在 [Service] 部分中添加以下行:

KillMode=process

将 KillMode 设置为进程可确保仅杀死主进程本身当装置停止时。这可确保子进程不受影响并继续独立运行。

进行更改后,保存文件并使用以下命令重新启动 systemd 服务:

sudo systemctl daemon-reload
sudo systemctl restart exectest

验证子进程的生存情况

要验证子进程是否在父进程终止后继续存在,请使用以下命令步骤:

  1. 使用 ps -ef | 检查正在运行的进程grep exectest:这应该显示在 systemd 用户下运行的主进程(exectest),并且子进程(exectest child)仍然处于活动状态。
  2. 终止父进程:向主进程发送信号(例如 sudo kill -INT ) 来终止它。
  3. 验证子进程是否存活:重新运行 ps -ef | grep exectest 检查子进程是否仍在运行。如果子进程一直处于活动状态,则服务文件修改成功。

以上是如何确保子进程在 systemd 中的父进程终止后继续存在?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn