NodeJS:退出父级,让孩子活着

时间:2014-07-22 11:15:33

标签: node.js external parent child-process

我正在写一个实用程序。该实用程序的一个命令是运行外部应用程序。

var child_process = require('child_process');
var fs = require('fs');

var out = fs.openSync('.../../log/out.log', 'a');
var err = fs.openSync('.../../log/err.log', 'a');

exports.Unref = function(app, argv) {

  var child = child_process.spawn(app, argv, {
    detached: true,
    stdio: [ 'ignore', out, err ]
  });
  child.unref();
  //process.exit(0);
};

目前:

$ utility run app --some-args // run external app
    // cant enter next command while app is running

我的问题是,如果我运行此命令,则在“外部”应用程序运行时终端被锁定。

但终端窗口不应被child_process锁定。

我想跑:

$ utility run app --some-args
$ next-command
$ next-command

外部应用程序(桌面应用程序)将由他自己关闭。

像这样:

$ subl server.js // this runs Sublime Text and passes a file to the editor
$ npm start // The terminal does not locked - i can execute next command while Sublime is still running

你知道我的意思^^?

1 个答案:

答案 0 :(得分:0)

['>>../../log/out.log', '2>>../../log/err.log']附加到argv的末尾而不是让两个文件保持打开状态应该可以正常工作,因为它是保持进程存活的打开文件句柄。

stdio之外,在detached: true中传递已打开的文件描述符将无法按预期的方式工作,因为无法在父进程中unref() {{1}}文件描述符并使其保持静止状态为儿童进程工作。即使有办法,我相信当父进程退出时,操作系统会清理(关闭)它打开的文件描述符,这会导致分离的子进程出现问题。

这可能是唯一可行的方法是将文件描述符传递给子进程,但该功能在几个稳定的分支之前被删除,因为在其他一些平台上不存在相同的功能(阅读:Windows )。