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
你知道我的意思^^?
答案 0 :(得分:0)
将['>>../../log/out.log', '2>>../../log/err.log']
附加到argv的末尾而不是让两个文件保持打开状态应该可以正常工作,因为它是保持进程存活的打开文件句柄。
除stdio
之外,在detached: true
中传递已打开的文件描述符将无法按预期的方式工作,因为无法在父进程中unref()
{{1}}文件描述符并使其保持静止状态为儿童进程工作。即使有办法,我相信当父进程退出时,操作系统会清理(关闭)它打开的文件描述符,这会导致分离的子进程出现问题。
这可能是唯一可行的方法是将文件描述符传递给子进程,但该功能在几个稳定的分支之前被删除,因为在其他一些平台上不存在相同的功能(阅读:Windows )。