Golang Go语言中 supervisor 重启 golang 项目时产生僵尸进程怎么办

发布于 1周前 作者 sinazl 来自 Go语言

golang 项目(服务器 A )使用 exec 包在服务器 B 上执行脚本,执行过程中如果 supervisor 重启 golang 项目,服务器 b 上进程就成了僵尸进程, 这个如何解决? 问:golang 项目需要单独接收 supervisor 重启信号?怎么接收?


Golang Go语言中 supervisor 重启 golang 项目时产生僵尸进程怎么办
12 回复

os/signal 包处理信号,不过 得先测试下 supervisor 重启发送的是什么信号。

更多关于Golang Go语言中 supervisor 重启 golang 项目时产生僵尸进程怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


重启发送 term 信号。结束进程就行了。至于你说的产生僵尸进程是因为没有监听端口吗?如果有的话不应该新进程起不来么。stop 超过等待时间会强制 kill 进程,你开子进程了?

没有监听端口,就是执行一个业务脚本 比如:统计日志信息 当然有一些复杂的业务执行需要很久。但是重启的话我需要将这个进程强杀掉,重新执行

#4

killasgroup=true

stopasgroup=true

stopwaitsecs=600 600 秒没停止强制 kill

非常驻进程不适合用 supervisor 跑

这个还没用过,目前都是用的 supervisor 来管理项目

systemd 可以解决这个问题( KillMode=cgroup )
这也是我一直提倡不要用 supervisorD 的原因之一

已经解决了,在 go 项目开启一个协程监听 term 信号,主动释放资源

systemd 不香吗

在Golang项目中,使用supervisor来管理进程时遇到僵尸进程问题,通常是由于子进程未正确被父进程回收导致的。以下是一些可能的解决步骤:

  1. 确保正确捕获信号: Go程序需要正确处理操作系统的信号,特别是SIGINTSIGTERM等,确保在接收到重启信号时能够优雅地关闭。可以通过os/signal包来监听这些信号,并在接收到信号时执行清理工作,如关闭数据库连接、停止HTTP服务等。

  2. 使用syscall.Exec重新启动: 在Go程序中,如果需要在接收到重启信号后重新启动自身,可以使用syscall.Exec函数。这个函数会用指定的程序替换当前进程镜像,这样新的进程将成为孤儿进程,由init进程接管,避免产生僵尸进程。

  3. 配置supervisor: 确保supervisor的配置文件中正确设置了autostartautorestart等参数,以及适当的重启策略(如unexpectedalways),避免不必要的频繁重启。

  4. 升级supervisor: 如果使用的是较旧的supervisor版本,考虑升级到最新版本,因为新版本可能已经修复了与僵尸进程相关的问题。

  5. 检查系统资源限制: 确认系统资源(如文件描述符、进程数)没有达到限制,这些限制有时也会导致进程管理异常。

通过上述步骤,通常可以解决由supervisor重启Golang项目时产生的僵尸进程问题。如果问题依旧存在,建议深入检查具体的应用逻辑和supervisor的日志输出。

回到顶部