如何在请求中使用child_process spawn的结果(获取ENOENT)

当执行包含下面的确切代码的js文件时,我得到一个ENOENT。 而我不知道如何解决这个问题。

任何解释或build议是受欢迎的,但我更喜欢解决scheme,我试图做到这一点。 (除非我做的事情当然是愚蠢的)

我已经写了这个假的请求函数用于testing目的:

(function imaginaryRequest(req, res) { getDiskInfo('/dev/simfs', info => { console.log(info.ratio) }) }()) 

它应该使用getDiskInfo函数使用child_process.spawn来获得df -Ph输出并将其存储到一个对象中。

 /** * Get information on the disk space of the specified File system * @param {string} sysFile (ex: /dev/sda) * @param {function} callback * @return {object} df -Ph output stored into object */ function getDiskInfo(sysFile, callback) { const spawn = require('child_process').spawn const df_Ph = spawn("df -Ph | grep " + sysFile); df_Ph.stdout.on('data', data => { let info = data .split(' ') .filter(el => el != '') callback({ maxSpace: info[1], used: info[2], unused: info[3], ratio: info[4], }) }) df_Ph.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); df_Ph.on('close', (code) => { console.log(`child process exited with code ${code}`); }); } 

这里是我在shell中得到的错误:

 events.js:160 throw er; // Unhandled 'error' event ^ Error: spawn df -Ph | grep /dev/simfs ENOENT at exports._errnoException (util.js:1022:11) at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32) at onErrorNT (internal/child_process.js:359:16) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickCallback (internal/process/next_tick.js:98:9) at Module.runMain (module.js:607:11) at run (bootstrap_node.js:420:7) at startup (bootstrap_node.js:139:9) at bootstrap_node.js:535:3 

谢谢。

首先,你产生的进程的参数必须作为产生的第二个参数传入一个数组中。 你得到ENOENT,因为spawn正在寻找一个叫做df -Ph | grep /dev/simfs的命令 df -Ph | grep /dev/simfs ,而不是df 。 你也不能在spawn中使用pipe道(因为pipe道不是进程的参数)。 这是一个shell的一个特性,所以你想做的一个方法就是生成一个shell。

 const df_Ph = spawn("sh", ["-c", "df -Ph | grep " + sysFile]); 

另一个是分别产生df -Phgrep ,并将第一个进程stdout传递给grep进程的stdin。 我相信这是一个更好的select,虽然它稍微多一些代码,但它避免了产生不必要的sh进程,并且更易读的IMO。 它看起来像这样:

 const df = spawn('df', ['-Ph']); const grep = spawn('grep', [sysFile], { stdio: [df.stdout, 'pipe', 'pipe'] } ); grep.stdout.on( 'data', data => { ...