Как объявить глобальный массив в exe c в javascript - PullRequest
0 голосов
/ 09 июля 2020

Я пишу сценарий js, чтобы найти все файлы 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 не обновляется, вероятно, потому, что он не объявлен глобальным или что-то связано с exe c, не позволяющим писать на внешние Объекты.

Любым способом заставить мой массив pidsarr добавляться при каждом запуске?

1 Ответ

1 голос
/ 09 июля 2020

pidsarr - это , добавляемое к каждому запуску. Однако вы просто планируете запуски в фоновом режиме и не дожидаетесь их завершения sh, поэтому вы не видите окончательного значения.

Вы можете проверить это с помощью setTimeout(() => console.log(pidsarr), 1000);

Чтобы заставить его ждать, вы можете либо переписать в терминах execSync, либо getpid вернуть 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));
});

Обратите внимание, что это плохая практика вызывать find и cat вот так. Это быстрее, надежнее и портативнее, чтобы использовать glob и fs для поиска и чтения файлов без внешних инструментов.

...