1

在我的 Node.js (v0.10.9) 代码中,我试图检测两种情况:

  • 安装了一个外部工具(点) - 在这种情况下,我想将一些数据发送到创建进程的标准输入
  • 未安装外部工具 - 在这种情况下,我想显示警告并且我不想发送任何东西来处理'stdin

我的问题是,当且仅当进程成功生成(即标准输入已准备好写入)时,我不知道如何将数据发送到孩子的标准输入。如果安装了dot ,以下代码可以正常工作,否则它会尝试将数据发送给孩子,尽管孩子没有产生。

var childProcess = require('child_process');

var child = childProcess.spawn('dot');
child.on('error', function (err) {
  console.error('Failed to start child process: ' + err.message);
});
child.stdin.on('error', function(err) {
  console.error('Working with child.stdin failed: ' + err.message);
});

// I want to execute following lines only if child process was spawned correctly
child.stdin.write('data');
child.stdin.end();

我需要这样的东西

child.on('successful_spawn', function () {
  child.stdin.write('data');
  child.stdin.end();
});
4

2 回答 2

0

从 node.js 文档:http ://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

检查失败 exec 的示例:

var spawn = require('child_process').spawn,
    child = spawn('bad_command');

child.stderr.setEncoding('utf8');
child.stderr.on('data', function (data) {
  if (/^execvp\(\)/.test(data)) {
    console.log('Failed to start child process.');
  }
});
于 2013-09-28T16:47:32.477 回答
0

看看核心工作者: https ://www.npmjs.com/package/core-worker

该软件包使处理流程变得更加容易。我认为您想要做的是这样的事情(来自文档):

import { process } from "core-worker";

const simpleChat = process("node chat.js", "Chat ready");

setTimeout(() => simpleChat.kill(), 360000); // wait an hour and close the chat

simpleChat.ready(500)
    .then(console.log.bind(console, "You are now able to send messages."))
    .then(::simpleChat.death)
    .then(console.log.bind(console, "Chat closed"))
    .catch(() => /* handle err */);

因此,如果该过程未正确启动,则不会执行任何 .then 语句,这正是您想要做的,对吧?

于 2015-12-15T10:07:47.940 回答