Node.js为什么子进程不能立即启动?

时间:2014-11-07 00:16:38

标签: javascript node.js process

我正在尝试编写一个全局节点命令行程序,它将接受我给它的任何(windows或unix)控制台命令并在新的控制台窗口中执行它。我还希望程序在生成其进程后退出,因此我正在使用的控制台不会被运行子进程的节点脚本阻止。

这是我目前的简单版本:

myScript.js:

var exec = require('child_process').exec;
exec("start startScript.cmd"); // windows start command opens a new cmd window
process.exit(0);

startScript.cmd:

mkdir test

我也尝试了这个(但即使没有process.exit,这也行不通):

myScript.js:

var spawn = require('child_process').spawn;
var child = spawn('start', ['startScript.cmd'], { detached: true, stdio: ['ignore', 'ignore', 'ignore']});
child.unref();
process.exit(0);

问题是,调用process.exit()似乎会阻止子进程完全启动,所以除非我做一些setTimeout恶作剧,否则什么都不会发生。但是这种行为似乎是随机的在另一台计算机上,它的行为就像我想要的那样。两台计算机都具有相同版本的节点(v0.10.33)。

除非我删除process.exit行或在其上使用setTimeout,否则永远不会进行目录测试。

知道为什么会这样或者如何解决这个问题?请记住,我不想等到子进程完成。我希望能够立即返回我的命令行。

谢谢!

1 个答案:

答案 0 :(得分:0)

我明白了。

答案是:不要使用exec,也不要在spawn调用中使用start或call或任何其他奇怪的windows命令。如果需要在生成选项中设置CWD,并直接生成您想要的内容,或者如果它仍然不起作用,则创建一个特定于操作系统的脚本来调用您的命令。 Windows脚本的一个例子就是:

%*

这样,启动或任何其他奇怪的Windows命令将被正确执行(但你真的需要它们吗?)。