如何在 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));
});
请注意,像这样调用 find
和 cat
是不好的做法。使用 glob
和 fs
无需外部工具即可查找和读取文件,速度更快、更健壮、更便携。
我正在编写一个 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));
});
请注意,像这样调用 find
和 cat
是不好的做法。使用 glob
和 fs
无需外部工具即可查找和读取文件,速度更快、更健壮、更便携。