首页  >  文章  >  后端开发  >  如何在 Golang 中执行长时间运行的进程并防止它们成为僵尸?

如何在 Golang 中执行长时间运行的进程并防止它们成为僵尸?

Patricia Arquette
Patricia Arquette原创
2024-10-27 21:16:01386浏览

How to Execute Long-Running Processes in Golang and Prevent Them From Becoming Zombies?

在 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中文网其他相关文章!

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