2013-12-18 30 views
0

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

这样做的过程是什么?

+1

您的运行node.js进程不知道“命令行”是什么。它运行在cpu上,并将其stdout和stderr数据发送到“Somewhere”,通过命令行界面调用它意味着命令行界面。你能否解释为什么你需要这样做,以便我们明白你想要达到的目标,而不是你认为你应该达到的目标? –

+0

我想制作一个Node程序,它将成为一个非常简单的Linux机器的启动界面,以展现一些非常简单的功能。有人告诉我,编辑/ etc/inittab是改变计算机启动的方式,但我想包括一个选项,用于从该提示中打开一个普通的BASH shell,以便有时展示全部功能。 – DanF

+0

不确定从执行的角度来看是否有意义。你可以让它产生一个进程,但是它会被节点进程“拥有”,所以如果这个进程死了,你的产生进程就会随之死亡。将节点作为启动界面运行的想法听起来很奇怪,但后来我没有所有的细节。 –

回答

1

如果你想要做的只是打开另一个终端,你可以简单地产生一个新的终端进程。您的特定Linux发行版使用哪个终端将需要弄清楚,但出于回答的目的,我将使用xterm。您可以通过以下命令产卵过程:

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

现在你会弹出打开另一个终端应该给你访问做任何你需要做的。您可以稍后在关闭过程中使用以下命令:

oTerminalProcess.kill(); 

你可能会想用产卵,而不是高管,因为Exec将有子进程后输出缓冲区溢出问题> 200 KB(http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

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

如果这是你想做的事,你将不得不附加事件侦听器来处理标准输入(http://nodejs.org/api/process.html#process_process_stdin),并直接推到标准输出,并使用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:"); 
     }); 
    } 

}); 

注意我有它设置为“跳槽”查杀程序或在您的情况查杀标准输入流接受输入。你必须克服的一个问题可能是拦截ctrl-c命令。现在它杀死了整个节点,但是你可能希望它只是简单地杀掉正在执行的命令。这肯定会有更多的工作,但没有什么是你无法克服的。

无论如何,这应该会给你一些选择。希望这可以帮助。

+0

看起来不错,(我正在使用后一种情况,没有涉及GUI)。我想知道如果我只是将子进程传递到当前节点进程中,并且我同意这是一个非常好管理的解决方案。感谢您向我展示您的方式,并指出exec vs spawn的警告! – DanF

+0

我注意到在你的第二个例子中,你使用exec代替了spawn,在你指出exec的200kb最大输出之后。产卵可以用于相同的效果,但没有输出限制? – DanF

+0

编写第二个例子时我的假设是单个控制台命令不会溢出200 kB缓冲区。不过,我想你不一定要依靠那个。但你绝对可以使用产卵并解决这个限制。知道何时以这种方式再次输出提示以获得更多用户输入会更困难。 。 。 – Brian

相关问题