如何在 javascript 中的 exec 中声明全局数组

How to declare a global array within an exec in javascript

我正在编写一个 js 脚本来定位服务器上的所有 pid 文件,提取 pids 然后 运行 ' ps -fp {pid} ' 在每个文件上提取 pid内存使用情况。

这是我目前得到的:

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

exec('(cd ~/; find . -type f -name "*.pid" )', (error, stdout, stderr) => {
    if (error) {
      return 1
    }
    var fileps = stdout.toString().split('\n');
    fileps.pop()  
    var pidsarr = new Array;
    
    function getpid(path) {
    var command = `(cd ~/; cat ${path} )`;
    exec(command, (error, stdout, stderr) => {
        if (error) {
          return 1
        }
        pid = parseInt(stdout.toString());
        pidsarr.push(pid);
    });
    }

    fileps.forEach(getpid);    
    console.log(pidsarr); 
});

问题是 pidsarr 没有得到更新,可能是因为它没有声明为全局或者与 exec 不允许写入外部对象有关。

有什么方法可以让我的 pidsarr 数组附加到每个 运行?

pidsarr 附加到每个 运行。但是,您只是在后台安排 运行s 而不是等待它们完成,所以您看不到最终值。

您可以使用 setTimeout(() => console.log(pidsarr), 1000);

来验证这一点

要让它等待,您可以根据 execSync 重写,或者让 getpid return 一个 Promise,然后等待所有的 Promise 解决:

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

exec('(cd ~/;  find . -type f -name "*.pid")', (error, stdout, stderr) => {
    if (error) {
      return 1
    }
    var fileps = stdout.toString().split('\n');
    fileps.pop()
    var pidsarr = new Array();

   function getpid(path) {
      var command = `(cd ~/; cat ${path} )`;
      return new Promise((resolve, fail) => {
        exec(command, (error, stdout, stderr) => {
          if (error) {
            fail();
          }
          pid = parseInt(stdout.toString());
          pidsarr.push(pid);
          resolve();
        });
      })
    }

    Promise.all(fileps.map(getpid)).then(() => console.log(pidsarr));
});

请注意,像这样调用 findcat 是不好的做法。使用 globfs 无需外部工具即可查找和读取文件,速度更快、更健壮、更便携。