2012-10-13 30 views
16

意圖:使用指定參數調用外部應用程序,然後退出腳本。如何在Node.js腳本中分離衍生的子進程?

下面的腳本不能正常工作,因爲它應該:

#!/usr/bin/node 
var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
cp.spawn('gnome-open', ['\''+MANFILE+'\''], {detached: true}); 

事情嘗試:exec - 不分離。提前

回答

25

非常感謝從node.js的文檔:

默認情況下,父母將等待沾邊兒退出。爲了防止父母等待給定的孩子,請使用child.unref()方法,並且父母的事件循環不會將孩子包括在其引用計數中。

使用分離選項啓動長時間運行的進程時,除非提供了未連接到父級的stdio配置,否則該進程不會在後臺保持運行狀態。如果父母的stdio被繼承,則孩子將繼續與控制終端連接。

您需要修改你的代碼是這樣的:

#!/usr/bin/node 
var fs = require('fs'); 
var out = fs.openSync('./out.log', 'a'); 
var err = fs.openSync('./out.log', 'a'); 

var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
var child = cp.spawn('gnome-open', [MANFILE], { detached: true, stdio: [ 'ignore', out, err ] }); 
child.unref(); 
+1

謝謝一堆!有用。 –

+2

您可以爲stdin,stdout,stderr設置「ignore」: 'stdio:['ignore'/ * stdin * /,'ignore'/ * stdout * /,'ignore'/ * stderr * /]' –

3

我解決了這個問題:

app.js

require('./spawn.js')('node worker.js'); 

spawn.js

module.exports = function(command) { 
    require('child_process').fork('./spawner.js', [command]); 
}; 

spawner.js

require('child_process').exec(
    'start cmd.exe @cmd /k "' + process.argv[2] + '"', 
    function(){} 
); 
process.abort(0); 
+0

即使你選擇了一個答案,也可以在這裏添加,因爲我的谷歌搜索沒有爲我提供明顯的替代解決方案。 – CarbonDonuts

+0

正如您所見,這是特定於操作系統的。對於那些在OS X和Unix/Linux上不太有用的人。接受的答案使用node.js自己的標準庫。 –

+2

意圖是:_創建一個分離的命令終端並傳遞一個command_ aka啓動一個進程。 'child_process'可悲地略低於在這方面從主人產生獨立進程的需要。只需更換你的Linux風格:xterm,xdg-open。除非你能告訴我如何用你的代碼來做到這一點...那麼在Windows和Linux上都可以。 ; P就像我說的,我試圖解決一個接近但不是很接近你想要的問題。谷歌把我扔在這裏,作爲我放棄併爲自己想出一些東西之前的最後希望。抱歉,添麻煩了。 – CarbonDonuts

相關問題