23

意图:调用具有指定参数的外部应用程序,并退出脚本。

以下脚本无法正常工作:

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

尝试过的事情:exec- 不分离。提前谢谢了

4

2 回答 2

48

从 node.js 文档:

默认情况下,父级将等待分离的子级退出。要防止父级等待给定的子级,请使用 child.unref() 方法,并且父级的事件循环不会将子级包含在其引用计数中。

当使用 detached 选项启动一个长时间运行的进程时,该进程将不会在后台保持运行,除非它提供了一个未连接到父进程的 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();
于 2012-10-13T09:35:40.003 回答
1

我对这个问题的解决方案:

应用程序.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);
于 2015-07-01T19:38:37.087 回答