Google Cloud VM上nohup启动的后台进程运行一段时间后自动终止是什么原因?
应用自动终止的原因及排查方案
- 命令配置缺陷导致错误日志遗漏
当前使用的启动命令nohup node server.js > out.log &仅将标准输出流存入日志,标准错误流的内容没有被落盘。如果应用抛出未捕获的运行时错误、依赖异常等输出到stderr的内容,你查看out.log时会看不到任何报错,不代表程序真的没有触发异常。
建议调整启动命令为nohup node server.js > out.log 2>&1 &,全量采集应用输出信息。 - systemd用户会话清理机制触发
Ubuntu 20.04默认启用的systemd-logind服务开启了用户退出会话后清理关联进程的逻辑,不管是否使用nohup,只要是当前SSH会话启动的进程,都会在会话关闭后被系统清理。你可以执行grep -i 'killed process' /var/log/syslog查看系统日志,如果能匹配到node进程的被杀记录,即可确认是该原因。
解决方法可以修改/etc/systemd/logind.conf配置,将KillUserProcesses参数设为no后重启logind服务;更稳妥的方案是编写systemd service配置文件托管Node应用,让进程完全脱离用户会话的生命周期。 - 系统OOM Killer主动终止进程
当系统可用内存不足时,Linux内核的OOM(内存不足)杀手会主动杀掉优先级较低的进程释放内存,这种情况应用日志不会留下任何记录,只有系统日志会留存相关信息。你可以在/var/log/syslog中搜索带OOM关键词的记录确认是否触发该机制。 - Node.js事件循环清空自动退出
如果你的server.js代码中没有持续保持事件循环活跃的逻辑,比如端口监听逻辑异常未生效、异步任务全部执行完毕、定时器到期后没有新的异步任务,Node.js会自动终止进程。本地运行时可能因为调试工具、终端交互逻辑额外保持了事件循环活跃,云端运行缺少这些环境就会触发自动退出。 - 未执行disown导致进程被会话连带清理
部分Shell环境默认开启huponexit选项,用户退出Shell时会给所有后台进程发送SIGHUP信号,即使使用nohup也可能被终止。你可以在启动后台进程后额外执行disown命令,将进程从Shell的作业列表中移除,避免会话关闭时被连带清理。
内容的提问来源于stack exchange,提问作者Lucas Miyazaki
相关产品推荐
相关产品推荐

