node.js如何通过进程名称检查进程是否正在运行?

node.js如何通过进程名称检查进程是否正在运行?,node.js,Node.js,我在linux中运行node.js,从node.js如何从进程名检查进程是否正在运行? 最坏的情况是我使用child_过程,但不知道是否有更好的方法 谢谢 您可以使用ps节点包 我相信你会看到这个例子。看看这个网站,他们还有很多其他用途。试试看 如果您没有绑定到nodejs,那么在linux命令行中,您还可以执行ps-ef | grep“您的_进程_名称_,例如_nodejs”,以检查是否有正在运行的进程。以下操作应该有效。将根据操作系统生成一个进程列表,并对所需程序的输出进行解析。该函数有三

我在linux中运行node.js,从node.js如何从进程名检查进程是否正在运行? 最坏的情况是我使用child_过程,但不知道是否有更好的方法


谢谢

您可以使用ps节点包

我相信你会看到这个例子。看看这个网站,他们还有很多其他用途。试试看


如果您没有绑定到nodejs,那么在linux命令行中,您还可以执行
ps-ef | grep“您的_进程_名称_,例如_nodejs”
,以检查是否有正在运行的进程。

以下操作应该有效。将根据操作系统生成一个进程列表,并对所需程序的输出进行解析。该函数有三个参数,每个参数都只是相应操作系统上的预期进程名

根据我的经验,ps节点需要太多的内存和时间来搜索进程。如果您计划经常检查流程,此解决方案会更好

const exec=require('child_process')。exec
功能正在运行(win、mac、linux){
返回新承诺(功能(解决、拒绝){
const plat=process.platform
const cmd=plat=='win32'?'tasklist':(plat=='darwin'?'ps-ax | grep'+mac:(plat=='linux'?'ps-A':'')
const proc=plat=='win32'?win:(plat=='darwin'?mac:(plat=='linux'?linux:“”))
如果(cmd==''| | proc==''){
解析(false)
}
exec(命令,函数(错误,标准输出,标准输出){
解析(stdout.toLowerCase().indexOf(proc.toLowerCase())>-1)
})
})
}

正在运行('myprocess.exe'、'myprocess'、'myprocess'、'myprocess')。然后((v)=>console.log(v))
对由d\u scalzi回答的代码进行了一些改进。函数使用回调而不是承诺,只使用一个变量查询,使用开关而不是if/else

const exec = require('child_process').exec;

const isRunning = (query, cb) => {
    let platform = process.platform;
    let cmd = '';
    switch (platform) {
        case 'win32' : cmd = `tasklist`; break;
        case 'darwin' : cmd = `ps -ax | grep ${query}`; break;
        case 'linux' : cmd = `ps -A`; break;
        default: break;
    }
    exec(cmd, (err, stdout, stderr) => {
        cb(stdout.toLowerCase().indexOf(query.toLowerCase()) > -1);
    });
}

isRunning('chrome.exe', (status) => {
    console.log(status); // true|false
})

@musaddin解决方案的另一个改进是使用自调用switch语句,而不是重新分配
let

/**
 * 
 * @param {string} processName The executable name to check
 * @param {function} cb The callback function
 * @returns {boolean} True: Process running, else false
 */
  isProcessRunning(processName, cb){
      const cmd = (()=>{
          switch (process.platform) {
              case 'win32' : return `tasklist`;
              case 'darwin' : return `ps -ax | grep ${processName}`;
              case 'linux' : return `ps -A`;
              default: return false;
          }
      })();
      require('child_process').exec(cmd, (err, stdout, stderr) => {
          cb(stdout.toLowerCase().indexOf(processName.toLowerCase()) > -1);
      });
  }

cmd
将被分配switch语句的结果,并生成更易于阅读的代码(特别是当涉及更复杂的代码时,自调用switch语句意味着您只创建所需的变量,而不需要在心里跟踪它们的值).

以下是其他答案的另一个版本,带有打字脚本和承诺:

export async function isProcessRunning(processName: string): Promise<boolean> {
  const cmd = (() => {
    switch (process.platform) {
      case 'win32': return `tasklist`
      case 'darwin': return `ps -ax | grep ${processName}`
      case 'linux': return `ps -A`
      default: return false
    }
  })()

  return new Promise((resolve, reject) => {
    require('child_process').exec(cmd, (err: Error, stdout: string, stderr: string) => {
      if (err) reject(err)

      resolve(stdout.toLowerCase().indexOf(processName.toLowerCase()) > -1)
    })
  })
}

对于相关主题,以下是一些最好的软件包:

按pid、名称模式和不同方式包进行搜索:
  • (我发现对我的需求很有兴趣的一个)

仅通过pid进行检查
查找过程的示例 按姓名搜索

const processesList = await findProcess(
    'name',
    /.*?\/kidoAgent\/Broker\/process.js.*/ // regex pattern
);

console.log({ processesList });

if (processesList.length === 0) {
     /**
      * No process
      * (create it)
      */
     // ......
}
它以数组形式返回找到的进程列表

运行时,对于
console.log({processesList})它显示:

{
  processesList: [
    {
      pid: 7415,
      ppid: 2451,
      uid: 1000,
      gid: 1000,
      name: 'node',
      bin: '/opt/node-v12.4.0-linux-x64/bin/node',
      cmd: '/opt/node-v12.4.0-linux-x64/bin/node ' +
        '/home/coderhero/Dev/.../build/.../kidoAgent/Broker/process.js'
    }
  ]
}

检查模块中的所有选项和方法

这将如何在windws上工作。我想这会给你带来错误windows@Shyam如
ps节点上公布的
home。它“应该”在windows上工作。如果没有,那么可能值得一个github问题。注意:此模块需要安装其他软件。这可能不适用于没有安装正确工具的系统或容器。这在所有平台上都能发挥神奇的作用。谢谢被否决。这个函数在mac上总是返回true,因为会有进程'px-ax | grep{query}'在这里运行是最好的模块,因为它不需要安装外部程序来工作
const processesList = await findProcess(
    'name',
    /.*?\/kidoAgent\/Broker\/process.js.*/ // regex pattern
);

console.log({ processesList });

if (processesList.length === 0) {
     /**
      * No process
      * (create it)
      */
     // ......
}
{
  processesList: [
    {
      pid: 7415,
      ppid: 2451,
      uid: 1000,
      gid: 1000,
      name: 'node',
      bin: '/opt/node-v12.4.0-linux-x64/bin/node',
      cmd: '/opt/node-v12.4.0-linux-x64/bin/node ' +
        '/home/coderhero/Dev/.../build/.../kidoAgent/Broker/process.js'
    }
  ]
}