Nodejs如何独立检查PID运行的进程?

Posted

技术标签:

【中文标题】Nodejs如何独立检查PID运行的进程?【英文标题】:Nodejs how to check independently a process is running by PID? 【发布时间】:2019-07-31 07:38:50 【问题描述】:

我正在使用child_process 生成一个子进程并从中获取返回 PID。我需要通过它的 PID 来管理这个子进程。以下是我的代码:

const childProcess = require('child_process');

let options = ['/c', arg1, arg2];

const myProcess = childProcess.spawn('cmd.exe', options, 
    detached: false,
    shell: false
);

let pid = myProcess.pid;

在运行期间,我想使用 PID 来独立于外部验证进程是否正在运行(完成/终止)。我想知道如何做到这一点以及在 Nodejs 中进行此验证的最佳方法是什么?我在 Windows 环境中运行应用程序。

欢迎提出任何建议,谢谢。

【问题讨论】:

***.com/questions/21255202/… 的可能重复项 @A.M. ***.com/questions/21255202/… 不是我预期的答案。我想从外部验证流程不听exit 事件 【参考方案1】:

我找到了is-running 模块建议的解决方案。但是我不想为了这个目的在我的项目中安装新模块,所以我创建了自己的checkRunning() 函数,如下所示:

// Return true if process following pid is running
checkRunning(pid) 
    try 
        return process.kill(pid, 0);
     catch (error) 
        console.error(error);
        return error.code === 'EPERM';
    

按照关于process.kill(pid[, signal]) 的Nodejs 文档,我可以使用process.kill() 来检查特定signal 参数值为0 的进程是否存在(不作为函数名杀死进程)。

我复印了一份文件说:

作为一种特殊情况,0信号可以用来测试进程是否存在

【讨论】:

【参考方案2】:

这可能会有所帮助,称为 is-running https://npmjs.org/package/is-running 的 npm 模块,正如这里提到的 - https://***.com/a/14884949/7927724

【讨论】:

谢谢我去看看 你的回答真的很有帮助,但我不想安装is-running 模块只是为了这个检查。我的解决方案只是应用process.kill 方法。感谢您的帮助,我会投票赞成【参考方案3】:

这是一个代码片段作为参考

win32 (cond) 
    return new Promise((resolve, reject) => 
      const cmd = 'WMIC path win32_process get Name,Processid,ParentProcessId,Commandline,ExecutablePath'
      const lines = []

      const proc = utils.spawn('cmd', ['/c', cmd],  detached: false, windowsHide: true )
      proc.stdout.on('data', data => 
        lines.push(data.toString())
      )
      proc.on('close', code => 
        if (code !== 0) 
          return reject(new Error('Command \'' + cmd + '\' terminated with code: ' + code))
        
        let list = utils.parseTable(lines.join('\n'))
          .filter(row => 
            if ('pid' in cond) 
              return row.ProcessId === String(cond.pid)
             else if (cond.name) 
              if (cond.strict) 
                return row.Name === cond.name || (row.Name.endsWith('.exe') && row.Name.slice(0, -4) === cond.name)
               else 
                // fix #9
                return matchName(row.CommandLine || row.Name, cond.name)
              
             else 
              return true
            
          )
          .map(row => (
            pid: parseInt(row.ProcessId, 10),
            ppid: parseInt(row.ParentProcessId, 10),
            // uid: void 0,
            // gid: void 0,
            bin: row.ExecutablePath,
            name: row.Name,
            cmd: row.CommandLine
          ))
        resolve(list)
      )
    )
  ,

来自https://github.com/yibn2008/find-process/blob/master/lib/find_process.js

【讨论】:

感谢@sinbar。但这不是我预期的答案。我想从外部独立验证流程,而不是听close 事件 那不是监听close事件,重点是'WMIC path win32_process get Name,Processid,ParentProcessId,Commandline,ExecutablePath'。它产生一个cmd进程并在其中运行一个shell命令并得到输出:proc.stdout.on('data', data => lines.push(data.toString()) ) 哦,我也不想听data事件的输出【参考方案4】:

如果想知道子进程何时退出,可以查看exit event

const  spawn  = require('child_process');
const bat = spawn('cmd.exe', ['/c', 'my.bat']);

bat.stdout.on('data', (data) => 
  console.log(data.toString());
);

bat.stderr.on('data', (data) => 
  console.log(data.toString());
);

bat.on('exit', (code) => 
  console.log(`Child exited with code $code`);
);

【讨论】:

感谢@A。 M. 但这不是我预期的答案。我想从外部独立验证流程,而不是听exit 事件【参考方案5】:

这里的相关主题最好的包

仅通过 pid 进行检查

https://www.npmjs.com/package/is-running

按 pid、名称模式和不同方式搜索包:

https://www.npmjs.com/package/find-process

https://www.npmjs.com/package/ps-node

https://github.com/sindresorhus/process-exists

【讨论】:

以上是关于Nodejs如何独立检查PID运行的进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取特定进程的pid

python 进程

NodeJs - 检查子进程是不是成功启动

Shell 获取进程 PID

检查正在运行的进程是 32 位还是 64 位

启动一个完全独立的进程