Lon*_*est 2 javascript linux scripting asynchronous node.js
在我写的其他程序中,我很喜欢使用promises的node.js的异步方面.
我想对Linux脚本使用相同的编程风格(使用node.js).换句话说,我希望能够同时执行多个Linux命令,然后在这些命令完成后,我希望node.js脚本能够异步执行另一组命令(依此类推).
我遇到了一个aritlce,它展示了如何使用node.js执行同步Linux命令,但是我还没有找到一个类似的教程,它涵盖了使用node.js管理多个异步Linux命令.
这目前可能吗?如果是这样,你能指导我一些可以帮助我开始实现这一目标的特定资源吗?
我不确定我是不对,但我认为你正在寻找exec和spawn.请参阅相关的API文档.文档中有两个命令的示例.
exec 和 spawnexec是"简单"的版本spawn.前者使用单个回调在命令完成时向用户报告,并且仅在完成/失败时报告.
child = exec('cat *.js bad_file | wc -l',
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});
所以基本上提供的回调函数只调用,当一切都被写入到标准输出/标准错误是可用的,完全.在进程终止(成功或失败)之后,才会调用回调,用户(您)可以对其进行操作.如果它失败了error是真的.
spawn是不同的,因为你可以听stdout/stderr 事件.首先,你"产生"一个过程.该spawn函数返回对子进程的引用.
var spawn = require('child_process').spawn;
var ls = spawn('ls', ['-lh', '/usr']);
ls这是你产生的子进程.它有两个属性(重要性现在),stdout而stderr这是事件发射器.他们正在发布这个data事件.当它写在任一流上的东西时,会调用在data事件上注册的回调.
ls.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});
当然还有其他重要事件(当然,请查看最新和相关信息的文档).
ls.on('close', function (code) {
  console.log('child process exited with code ' + code);
});
spawn当你想要在stdout上捕获东西时,你可以使用它,例如在进程运行时.一个很好的例子是,如果你产生了一个ffmpeg编码任务,需要几分钟才能完成.你可以在stderr上监听(因为ffmpeg将进度信息写入stderr而不是stdout)来解析"进度"信息.
carrier您可以使用一个很好的额外库spawn.它被称为载体.它有助于从生成的进程的stdout/stderr中读取"行".它很有用,因为data传递给回调的参数不一定包含由"分隔"的"完整"行\n.carrier帮助.(但是,它不会帮助你捕获ffmpeg在stderr上的进度,因为在这种情况下没有ffmpeg写的换行符,它只是一个回车符,这行总是基本重写.)
你会像这样使用它
var carry = require("carrier").carry;
var child = spawn("command");   
carry(child.stdout, function(line) {
   console.log("stdout", line);
});
如果您想使用promise/deferred样式方法,那么您可以使用AngularJS 使用Q的以下内容- 或者至少非常类似的内容(请参阅有关promises的完整教程的链接).
spawn返回一个Emitter不是promise 的对象.所以你必须将调用包装到spawn(请参阅使用Deferreds).
var q = require("q");
var spawn = require("child_process").spawn;
var ls = function() {
  var deferred = q.defer();
  var ls = spawn("ls", ["-lh", "/usr"]);
  ls.stdout.on("data", function(data) {
    deferred.notify({stdout: true, data: data});
  });
  ls.stderr.on("data", function(data) {
    deferred.notify({stderr: true, data: data});
  });
  ls.on("close", function(code) {
    if (code === 0) {
      deferred.resolve();
    } else {
      deferred.reject(code);
    }
  });
  return deferred.promise;
};
通过执行ls()现在返回一个您将使用的承诺,就像任何其他承诺一样.当它完全解决后,将调用第一个回调.如果发生错误(该过程存在非零退出代码),则调用错误处理程序.当命令进行时,将调用第三个回调(通知回调).
ls().then(function() {
  console.log("child process exited successfully");
}, function(err) {
  console.log("child process exited with code " + err);
}, function(args) {
  if (args.stdout) {
    console.log("stdout: " + args.data);
  } else {
    console.log("stderr: " + args.data);
  }
});
当某些东西写入stderr时你可以立即调用拒绝,但这是一个设计决定.回到ffmpeg示例,这对你没有任何好处,因为ffmpeg将一般信息吐出到stderr.但是它可以与其他命令一起使用.
我想你会得到它:)
示例来自nodejs的文档,因为它们很好理解.
| 归档时间: | 
 | 
| 查看次数: | 2030 次 | 
| 最近记录: |