【问题标题】:How to declare a global array within an exec in javascript如何在javascript中的exec中声明全局数组
【发布时间】:2020-07-09 15:56:14
【问题描述】:

我正在编写一个 js 脚本来定位服务器上的所有 pid 文件,提取 pid,然后在每个文件上运行“ps -fp {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 数组在每次运行时附加?

【问题讨论】:

    标签: javascript arrays linux exec global


    【解决方案1】:

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

    您可以通过setTimeout(() => console.log(pidsarr), 1000); 验证这一点

    要让它等待,您可以根据 execSync 重写,或者让 getpid 返回一个 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 查找和读取文件,无需外部工具,更快、更健壮、更便携。

    【讨论】:

    • 非常感谢你这个非常有用的答案!!!!!!!!!!!!我认为 usind find 和 cat 可能不是最有效的方法。我也会看看 glob 和 fs 。 (自从上周开始使用 linux 以来,我几乎是个菜鸟 :()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2011-03-28
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多