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

Javascript Node.js为什么子进程不能立即启动?,javascript,node.js,process,Javascript,Node.js,Process,我正在尝试编写一个全局节点命令行程序,它将接受我给它的任何(windows或unix)控制台命令,并在新的控制台窗口中执行它。我还希望程序在生成其进程后退出,这样我使用的控制台就不会被运行子进程的节点脚本阻止 这是我到目前为止所拥有的一个简单版本: myScript.js: var exec = require('child_process').exec; exec("start startScript.cmd"); // windows start command opens a new cm

我正在尝试编写一个全局节点命令行程序,它将接受我给它的任何(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);
var spawn = require('child_process').spawn;
var child = spawn('start', ['startScript.cmd'], { detached: true, stdio: ['ignore', 'ignore', 'ignore']});
child.unref();
process.exit(0);
startScript.cmd:

mkdir test
我也尝试过这一点(但即使没有process.exit,这也不起作用):

myScript.js:

var exec = require('child_process').exec;
exec("start startScript.cmd"); // windows start command opens a new cmd window
process.exit(0);
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()似乎会阻止子进程完全启动,因此除非我做一些设置超时的把戏,否则不会发生任何事情。然而,这种行为似乎是随机的。在另一台计算机上,它的行为就像我想要的那样。两台计算机具有相同版本的节点(v0.10.33)

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

你知道为什么会发生这种情况,或者如何避开它吗?请记住,我不想等到子进程完成。我希望能够立即返回到命令行

谢谢

我明白了

答案是:不要在spawn调用中使用exec,也不要使用start或call或任何其他奇怪的windows命令。如果需要,在spawn选项中设置CWD,并直接生成所需内容,或者生成一个特定于操作系统的脚本,在命令仍然无法工作时调用该命令。windows脚本的一个示例就是:

%*

这样,start或任何其他奇怪的windows命令都将正确执行(但您真的需要它们吗?)。

请参见此处:
.spawn()
child.unref()
和单独的stdio流。我实际上已经尝试过了。此外,如果这是问题所在,则当子进程仍在运行时,我尝试调用process.exit()时,也会导致子进程关闭。但这不是我的情况,因为如果我在退出调用上使用setTimeout 0 ms,即使运行10秒的进程也会保持运行。另外,spawn不允许我使用start命令。那么,你的问题是什么呢?如果它在退出之前用一个短的
setTimeout()
就可以满足您的需要,那么您为什么不直接使用它呢?因为这太糟糕了,我希望让多个子进程运行不同的命令。我想我可以得到我将要运行的命令的数量,然后将它乘以ms的数量,这就是我的setTimeout量。但是是的。。。。打开一个新窗口似乎需要太长的时间,所以它永远不会完全启动,即使对于exec来说,它运行了这个命令。因此,请将您的问题改为“如果您真的想知道,为什么需要一个
setTimeout()
来可靠地启动一个独立的子进程?”。