【问题标题】:Node.js ruby subprocess hangsNode.js ruby​​ 子进程挂起
【发布时间】:2025-11-29 03:50:01
【问题描述】:

基于示例 here,我正在尝试从 Node.js (v0.4.8) 生成一个 ruby​​ 进程 (v1.8.7)。创建了一个进程和一个空的日志文件,但在我杀死它之前什么都没有发生。如果我省略了STDIN.each_line 位,代码运行良好。

我怀疑某些标准输入没有完成,所以 ruby​​ 仍在等待输入。也许ruby.stdin.write("ping\n"); 没有做我认为应该做的事?

【问题讨论】:

  • 你自己运行过ruby代码吗?您是否看到相同的行为,还是按预期运行?
  • @pat 如果我从命令行运行 ruby​​ 代码,输入一些随机文本并按 Enter,它会回显文本并在同一目录中创建一个日志文件。
  • 更正:它确实创建了一个空的进程日志文件,只是不是我预期的。我会更新我的问题。如果我省略 STDIN.each_line 部分,我还发现 ruby​​ 文件可以正常工作。

标签: ruby node.js


【解决方案1】:

这就是我所拥有的似乎可以满足您的需求:

var util  = require('util'),
    sys   = require('sys'),
    spawn = require('child_process').spawn,
    ruby  = spawn('ruby', [__dirname + '/process.rb']);

function trim(str) {
  return str.replace(/^\s+|\s+$/, '');
}

ruby.stdout.on('data', function(data) {
  console.log('stdout: ' + trim(data.toString()));
});

ruby.stdout.on('end', function(data) {
  ruby.stdout.flush();
});

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

ruby.on('exit', function(code, signal) {
  if(code != null) console.log('exit: ' + code);
  else if(signal != null) console.log('killed: ' + signal);
});

ruby.stdin.write("ping\n");
ruby.stdin.end();

【讨论】: