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

时间:2017-05-30 20:28:19

标签: node.js request child-process spawn

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

任何解释或建议都是受欢迎的,但我更愿意为我尝试的方式提供解决方案。 (除非我当然做了一些非常愚蠢的事情)

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

(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

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,必须在数组中传递生成进程的参数作为spawn的第二个参数。你正在获得ENOENT,因为spawn正在寻找一个名为Error in strptime(x, format, tz = "GMT") : use of %Z for input is not supported 的命令,而不是df -Ph | grep /dev/simfs。您也不能在spawn中使用管道(因为管道不是进程的参数)。这是shell的一个特性,所以实现你想要的一种方法就是生成一个shell:

df

另一种方法是分别生成const df_Ph = spawn("sh", ["-c", "df -Ph | grep " + sysFile]); df -Ph,并将第一个进程stdout传递给grep进程的stdin。我认为这是更好的选择,虽然代码稍微多一些,但它避免了产生不必要的grep进程并且更易读的IMO。它看起来像这样:

sh