【问题标题】:How to check if an arbitrary PID is running using Node.js?如何使用 Node.js 检查任意 PID 是否正在运行?
【发布时间】:2013-01-01 16:35:51
【问题描述】:

是否有某种方法可以使用 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。

【问题讨论】:

    标签: node.js pid platform-independent


    【解决方案1】:

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

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

    “如果target不存在会抛出错误,作为特殊情况,可以使用0信号来测试进程是否存在。”

    例子:

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

    【讨论】:

      【解决方案2】:

      我还需要检查项目中运行的 pid。我把 this answer 使用 kill -0 <PID> 包装在一个名为 is-running https://npmjs.org/package/is-running

      的模块中

      npm install is-running

      【讨论】:

      • +1 不会为杀戮而生成孩子。只是一个问题,为什么你需要模块 exec 在你的 index.js 中?
      • exec 是以前版本遗留下来的。它应该消失
      • 这适用于简单的情况,但请注意,如果您的用户无权向它们发出信号,它将报告进程不存在。例如,除非您以 root 用户身份运行,否则 PID 1(操作系统的根 PID)和任何系统级守护进程 PID 都将被报告为不存在。
      • @ZacB 至少在 macOS 上,如果进程存在但你没有权限,你会得到 EPERM,如果不存在,你会得到 ESRCH
      【解决方案3】:

      我不是这方面的专家,但你能不能生成一个子进程来使用命令行工具检查状态?

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 2017-07-21
        • 2011-06-06
        • 2012-11-11
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 2020-08-03
        • 2010-09-24
        相关资源
        最近更新 更多