我有一个运行的Node.js脚本来执行一些数据库操作。我使用spawn
功能创建了几个子进程。奇怪的是,我停止在输出中获得回车。例如:
running...
more output.
more output.
complete.
设置如下:
我以这种方式产生子进程:
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路由有关,但无法弄清楚。任何提示都非常感谢!
答案 0 :(得分:0)
通过小心子进程终止,我能够解决bash在执行后被搞砸的问题。原来我没有正确终止其中一个子进程,一旦我确定它已经死了,在结束父进程之前bash问题就消失了。
我从未弄清楚为什么我需要public class Library
{
public static final Logger Log = Logger.getLogger(Library.class);
public void initialized(){
Log.info("Inside initialise")
}}
。