在 Golang 中运行命令并将其与进程分离
当您需要在 Golang 中执行长时间运行的进程时,就会出现此问题,使用特定要求,例如:
- 将进程标准输出重定向到文件
- 控制进程的用户
- 确保进程在父程序退出后继续运行
- 防止进程崩溃时成为僵尸
- 获取正在运行的进程的PID
您尝试使用 Cmd.Start() 和 Cmd.Wait() 的解决方案满足大多数这些要求,除了当您向程序发送 SIGTERM/SIGKILL 时防止底层进程崩溃。
解决方案
而不是尝试重新发明轮子,考虑使用以下库之一:
- https://github.com/krallin/tini
- https://busybox.net/
- https: //software.clapper.org/daemonize/
- https://wiki.gentoo.org/wiki/OpenRC
- https://www.freedesktop.org/wiki/Software/systemd /
Go-reap 库
推荐的解决方案是使用 https://github.com/hashicorp/go-reap 库。
注释
- 您关于将进程与其父进程分离的假设是不正确的。在Linux中,每个进程都有一个父进程,创建后就无法更改它。
- “我想将其作为守护进程运行”语句不清楚。 Linux 中的守护进程有一个父 PID,并遵守父子规则。
- 当 SIGTERM/SIGKILL 发送到程序时底层进程崩溃的问题无法用 go-reap 库重现.
免责声明
提供的解决方案重点解决防止子进程成为僵尸的问题。对于满足所有要求的完整解决方案,可能需要组合使用多种方法。
以上是如何在 Golang 中执行长时间运行的进程并防止它们成为僵尸?的详细内容。更多信息请关注PHP中文网其他相关文章!