使用 PM2 的进程在 Linux 系统中无法通过 "kill -9" 命令杀死

背景介绍

如果你在前端开发中使用 PM2 来管理 Node.js 进程,可能会遇到无法通过 "kill -9" 命令杀死进程的问题。这是因为 PM2 的进程是使用 Node.js 的 child_process 模块来创建的,而不是使用 Linux 系统提供的进程创建机制。

问题分析

了解问题的原因之前,先看一下使用 "kill -9" 命令的目的。"kill -9" 命令会发送一个强制终止信号给指定的进程,让进程立即停止。但是,如果进程接收到信号后无法关闭,就会导致进程僵死。

使用 PM2 管理的 Node.js 进程其实是 "披着羊皮的狼",虽然它在外表上看起来是一个普通的进程,但实际上它是由 Node.js 应用程序创建的子进程。因此,在 Linux 系统中使用 "kill -9" 命令只会杀死 PM2 进程管理器,而不会杀死 Node.js 子进程,因为它们是由 PM2 中间层进程管理的。

解决方案

使用 PM2 管理的进程,推荐使用 PM2 来停止和管理进程。如果需要手动杀死进程,可以使用 PM2 的命令:"pm2 stop app" 命令来停止进程。

--- ---- ---

如果仍然需要使用 "kill -9" 命令来杀死 PM2 进程,建议不要直接使用 "kill -9" 命令,而是先用 "ps -ef | grep pm2" 命令查询 PM2 进程的 PID,然后再使用 "kill -15 PID" 命令发送 "SIGTERM" 信号给 PM2 进程,等待进程优雅地关闭。如果进程无法优雅地关闭,则可以使用 "kill -9 PID" 命令杀死进程。

-- --- - ---- ---
---- --- ---

注意事项

  • PM2 安装全局模块:npm install pm2 -g
  • PM2 命令的常用选项:
    • start : 启动 app
    • stop : 停止指定的 app
    • restart : 重启指定的 app
    • delete : 删除指定的 app
    • list: 列出所有正在运行的 app
    • monit: 查看所有 app 进程资源状态
    • logs: 查看所有 app 进程日志
  • PM2 可以使用 pm2 logs 命令来监视 PM2 进程和子进程日志的实时输出。

结论

使用 PM2 管理进程时,尽量使用 PM2 命令进行进程的管理和维护,避免使用 "kill -9" 命令来杀死进程。只有在出现异常情况时,才应该使用 "kill -15" 和 "kill -9" 命令来关闭和杀死进程。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6716f381ad1e889fe21ec8c9