我有一个 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);
});
我能够通过对子进程的标准输出数据执行 .replace(/\n/g, "\r\n")
来解决这个问题,如上所示。
但是,现在当主父进程终止时,它运行的 bash shell 遇到了类似的问题:它既不输出回车符也不输出换行符。我输入的文本也不会显示。如果我关闭它在 (Mac OSX) 中运行的终端窗口并重新打开,问题就会消失。
我可以验证当父进程终止时,所有子进程也会终止。至少,我对所有这些进程调用 .kill('SIGINT')
并且我能够关闭终端,而不会收到任何有关子进程终止的警告。
我想知道它是否与生成进程的 stdio 路由有关,但无法弄清楚。非常感谢任何提示!
最佳答案
通过小心子进程终止,我能够解决 bash 在执行后搞砸的问题。事实证明,我没有正确终止其中一个子进程,一旦我在结束父进程之前确定它已经死亡,bash 问题就消失了。
我从来没有弄清楚为什么我需要.replace(/\n/g, "\r\n")
。
关于javascript - 使用 Node.js 子进程时没有回车?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898114/