一直都以为 process.argv 包含了当前进程的完整命令行参数,child_process 中的 fork 等拉起子进程指定进程参数的方法也同样是可以指定任何命令行参数,例如:
const cp = require('child_process');
cp.fork('./child.js', ['--inspect', '--key', '--key1=v1'], {
stdio: 'inherit',
});
以上的代码中,给子进程指定了 --inspect 参数,以期能够开启该子进程的调试模式。但最近才发现这种写法根本不生效,非常令人困惑。查找资料对比之下,才发现原因,即:
-
--inspect--inspect-brk等node.js专有的命令行参数,在node.js中被分类为execArgv,不属于argv。例如:# 以调试模式启动 repl node 进程 $ node --inspect Debugger listening on ws://127.0.0.1:9229/411db276-52b3-48cb-98fb-f962ad64f3fd For help, see: https://nodejs.org/en/docs/inspector Welcome to Node.js v16.20.2. Type ".help" for more information. # 打印出 argv > process.argv [ 'C:\\path\\to\\node\\v16.20.2\\bin\\node.exe' ] # 打印出当前的 execArgv > process.execArgv [ '--inspect' ] -
想要在
child_process中通过这些node.js专有的命令行参数影响其行为,需要使用第三个参数options.execArgv传入。const cp = require('child_process'); cp.fork('./child.js', ['--key', '--key1=v1'], { stdio: 'inherit', execArgv: ['--inspect-brk'], // !IMPORTANT: 调试参数附加在这里 });