2013-12-18 29 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

相關問題