2012-10-13 31 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

相关问题