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

Node.js why does a child process not start right away?

本文关键字:启动 子进程 js 为什么不 Node      更新时间:2023-09-26

我正在尝试编写一个全局节点命令行程序,该程序将接受我给它的任何(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

我也尝试过这个(但即使没有流程,这个也不起作用。退出):

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,否则永远不会进行目录测试

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

谢谢!

我想明白了。

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

%*

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