如何使用Node.js检查任意PID是否正在运行?

26

有没有一种方法可以使用Node.js检查系统上任意PID是否正在运行或存活?假设Node.js脚本具有适当的权限以读取/proc或Windows等效目录。

这可以同步完成:

if (isAlive(pid)) { //do stuff }

或者异步地:

getProcessStatus(pid, function(status) {
    if (status === "alive") { //do stuff }
}
请注意,我希望找到适用于任意系统 PID 的解决方案,而不仅仅是运行中的 Node.js 进程的 PID。
2个回答

39

您可以调用 process.kill(pid, 0) 并将其放在 try/catch 块中。

http://nodejs.org/api/process.html#process_process_kill_pid_signal -

"如果目标不存在,它会抛出一个错误。作为一种特殊情况,可以使用信号 0 来测试进程的存在性。"

示例:

function pidIsRunning(pid) {
  try {
    process.kill(pid, 0);
    return true;
  } catch(e) {
    return false;
  }
}

对于今天需要听到这句话的人:是的,即使process.kill的其他用途并不总是如你所期望的那样(例如,在Windows上,-2不会发送SIGINT信号,而只是杀死进程),但它确实可以在Windows上工作。 - data princess

19

+1 不会生成一个子进程来杀死进程。不过,我有一个问题,为什么你的 index.js 需要 exec 模块呢? - hexacyanide
exec是从以前的版本中遗留下来的。它应该被移除。 - Noah
1
这在简单情况下是有效的,但请注意,如果您的用户没有权限向它们发送信号,则会报告进程不存在。例如,除非您以root用户身份运行,否则PID 1(操作系统的根PID)和任何系统级别的守护程序PID都将被报告为不存在。 - Zac B
在 macOS 上,如果进程存在但您没有权限,则会出现 EPERM 错误,如果进程不存在,则会出现 ESRCH 错误。 - w00t
1
我认为应该选择一个干净的解决方案(不需要另一个npm模块)作为被选答案。 - Kyeno
我非常反对在任何简单的任务中使用NPM包。 - Soroush Bgm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接