退出Node.js程序并在终端中打开另一个程序

时间:2013-12-18 01:33:59

标签: node.js

我想在我当前的Node.js程序中有一个条件,它将从占用命令提示符退出并改为打开另一个命令行应用程序。

实现这一目标的过程是什么?

1 个答案:

答案 0 :(得分:1)

如果您只想打开另一个终端,您可以简单地生成一个新的终端进程。您的特定Linux发行版使用哪个终端必须弄清楚,但为了回答这里,我将使用xterm。您可以通过以下命令生成进程:

var spawn = require('child_process').spawn;
var oTerminalProcess = spawn("xterm", []);

现在,您将弹出另一个终端,该终端应该可以让您访问您需要做的任何事情。稍后您可以使用以下命令关闭该过程:

oTerminalProcess.kill();

您可能希望使用spawn而不是exec,因为exec在子进程输出后会出现缓冲区溢出问题> 200 kB(http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

当然所有这些都假设某种GUI桌面类型环境。如果你想在GUI没有运行时从一个控制台完成所有这些操作,那将是一个完全不同的问题。

如果这是你想要做的,你将不得不附加事件监听器来处理stdin(http://nodejs.org/api/process.html#process_process_stdin)并直接推送到stdout并使用exec自己模拟一个终端。这并不是非常困难,但我可以想象,对于特殊情况,细节可能会变得毛茸茸。它可能看起来像这样(我在节点0.8.21上进行了测试,它对我有用):

var exec= require('child_process').exec;
process.stdin.resume();
process.stdin.setEncoding('utf8');
var sInputBuffer = "";

process.stdout.write("$Prompt: ");

process.stdin.on('data', function(chunk) {
  sInputBuffer += chunk;
  if(chunk === "quit\n")
  { process.stdin.pause();
  }
  else
  {
      exec(sInputBuffer, function(error, stdout, stderr){
        if(stdout.length > 0)
        {  process.stdout.write(stdout);  }
        else
        {  process.stdout.write(stderr);  }

         sInputBuffer = "";
         process.stdout.write("\n$Prompt:");
      });
    }

});

注意我已经设置了“退出”杀死程序或在你的情况下杀死接受输入的stdin流。您必须克服的一个问题可能是拦截ctrl-c命令。现在,这会杀死整个节点,但您可能希望它简单地终止您正在执行的命令。那肯定会有更多的工作,但是你无法克服。

无论如何,这应该会为您提供几种选择。希望这会有所帮助。