使用Node.js子进程时没有回车?

时间:2016-04-27 18:32:30

标签: javascript node.js bash macos

我有一个运行的Node.js脚本来执行一些数据库操作。我使用spawn功能创建了几个子进程。奇怪的是,我停止在输出中获得回车。例如:

running...
          more output.
                      more output.
                                  complete.

设置如下:

  • 主要父母程序:开始用管道输送孩子
    • 主要子进程:执行大多数数据库事务
      • 子子进程1:打开VPN隧道并在整个执行过程中保持运行
      • 子子进程2:运行简短脚本然后终止

我以这种方式产生子进程:

var spawn = require('child_process').spawn;
STATE.childProcesses.logged = spawn('sh',['-c', cmd],{
  stdio: [0]
});

STATE.childProcesses.logged.stdout.on('data', function (data) {
  process.stdout.write(data.toString().replace(/\n/g, "\r\n"));
});

STATE.childProcesses.logged.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

STATE.childProcesses.logged.on('exit', function (code) {
  console.log('main child process exited with code ' + code);
});

我能够通过对子进程的stdout数据执行.replace(/\n/g, "\r\n")来解决这个问题,如上所示。

但是,现在当主父进程终止时,它运行的bash shell遇到了类似的问题:它既不输出回车也不输出换行符。我输入的文字也没有显示出来。如果我关闭它在(Mac OSX)中运行的终端窗口并重新打开问题就会消失。

我可以验证当父进程终止时,所有子进程也会终止。至少,我在所有这些上面调用了.kill('SIGINT'),并且我可以关闭终端而不会有任何有关子进程被终止的警告。

我想知道它是否与生成的进程的stdio路由有关,但无法弄清楚。任何提示都非常感谢!

1 个答案:

答案 0 :(得分:0)

通过小心子进程终止,我能够解决bash在执行后被搞砸的问题。原来我没有正确终止其中一个子进程,一旦我确定它已经死了,在结束父进程之前bash问题就消失了。

我从未弄清楚为什么我需要public class Library { public static final Logger Log = Logger.getLogger(Library.class); public void initialized(){ Log.info("Inside initialise") }}