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运行的进程?的主要内容,如果未能解决你的问题,请参考以下文章