windows 上的节点 child_process.spawn 错误文件描述符与 ipc
Node child_process.spawn bad file descriptor on windows with ipc
我正在尝试通过 child_process spawn 在带有 ipc 选项的节点中生成一个命令。
我叫什么:
const {spawn} = require('child_process');
const cmd = spawn('npm', ['-v'], {
shell: true,
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
});
cmd.on('message', (msg) => console.log(msg));
我得到的:
child_process.js:122
p.open(fd);
Error: EBADF: bad file descriptor, uv_pipe_open
Child (child_process.js:122:5)
at setupChildProcessIpcChannel (internal/bootstrap/pre_execution.js:329:30)
at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:54:3)
at internal/main/run_main_module.js:7:1 {
errno: -4083,
code: 'EBADF',
syscall: 'uv_pipe_open'
}
只有在特殊配置下才会发生这种情况:
- 在 windows
- 带有 'ipc' 选项
- spawned 命令是 js 中的东西
将失败:another.js
、npm
不会失败:node
有个closed issue用处不大
根据这个article,我需要 shell: true
来实现跨平台兼容性。
这个issue好像也有关系,但是我看了之后并没有变聪明
节点 v12.18.3
感谢您的帮助。
您不能将 'ipc' 与 npm 一起使用,因为 npm“二进制”是一个 shell 脚本,而不是节点进程(参见 https://github.com/npm/cli/tree/latest/bin)
Accessing the IPC channel fd in any way other than process.send() or using the IPC channel with a child process that is not a Node.js instance is not supported.
对于 another.js
,使用 fork
(将始终有效)或 spawn('node', 'another.js')
如果您不使用节点垫片(如 nodist)
我正在尝试通过 child_process spawn 在带有 ipc 选项的节点中生成一个命令。
我叫什么:
const {spawn} = require('child_process');
const cmd = spawn('npm', ['-v'], {
shell: true,
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
});
cmd.on('message', (msg) => console.log(msg));
我得到的:
child_process.js:122
p.open(fd);
Error: EBADF: bad file descriptor, uv_pipe_open
Child (child_process.js:122:5)
at setupChildProcessIpcChannel (internal/bootstrap/pre_execution.js:329:30)
at prepareMainThreadExecution (internal/bootstrap/pre_execution.js:54:3)
at internal/main/run_main_module.js:7:1 {
errno: -4083,
code: 'EBADF',
syscall: 'uv_pipe_open'
}
只有在特殊配置下才会发生这种情况:
- 在 windows
- 带有 'ipc' 选项
- spawned 命令是 js 中的东西
将失败:another.js
、npm
不会失败:node
有个closed issue用处不大
根据这个article,我需要 shell: true
来实现跨平台兼容性。
这个issue好像也有关系,但是我看了之后并没有变聪明
节点 v12.18.3
感谢您的帮助。
您不能将 'ipc' 与 npm 一起使用,因为 npm“二进制”是一个 shell 脚本,而不是节点进程(参见 https://github.com/npm/cli/tree/latest/bin)
Accessing the IPC channel fd in any way other than process.send() or using the IPC channel with a child process that is not a Node.js instance is not supported.
对于 another.js
,使用 fork
(将始终有效)或 spawn('node', 'another.js')
如果您不使用节点垫片(如 nodist)