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

标签 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);
});

我能够通过对子进程的标准输出数据执行 .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/

相关文章:

javascript - 如何在 ajax 成功重定向上设置 flash 消息

javascript - Onclick 将 UL 转换为 JSON

javascript - Bootstrap 轮播不自动滑动

node.js - Connect 1.8.0 - 多部分支持 - 强大的报告进度 - 大文件?

bash - 递归复制文件夹,排除部分文件夹

bash - Ubuntu bash –eq : binary operator expected - nested for loop

javascript - onbeforeunload 处理程序真的会停止我的页面缓存吗?

node.js - 如何将 JQuery AJAX 请求中的数据发送到 Node.js 服务器

node.js - 创建 react 应用程序/ express 代理错误 : Could not proxy request (ECONNRESET)

bash - 为所有用户删除 BASH 历史记录