如何在Node.js中从一个JS文件调用运行另一个JS文件?
解决Node.js中执行长期运行脚本导致主进程卡住的问题
问题原因
你使用shell.exec时默认是同步执行模式,当OS1.js是持续运行的控制台游戏(比如包含无限循环或等待用户输入的逻辑)时,主进程会一直等待子进程结束,导致终端卡住无响应。
解决方案
方案1:使用ShellJS的异步执行模式
给shell.exec添加async: true配置,让命令在后台执行,不会阻塞主进程:
const shell = require('shelljs'); if (Bootup === "StartOS1") { shell.exec('node OS1.js', { async: true }, (exitCode, stdout, stderr) => { if (exitCode !== 0) { console.error(`执行出错:${stderr}`); } }); }
方案2:使用Node.js原生child_process模块(推荐)
原生模块更灵活,适合处理Node.js子进程,推荐用fork(专门用于Node.js进程,支持进程间通信)或spawn:
使用fork(适合需要IPC的场景)
const { fork } = require('child_process'); if (Bootup === "StartOS1") { const osProcess = fork('./OS1.js'); // 可选:监听子进程的错误和退出事件 osProcess.on('error', (err) => { console.error('启动子进程失败:', err); }); osProcess.on('exit', (code) => { console.log(`子进程已退出,退出码:${code}`); }); }
使用spawn(适合需要继承终端交互的场景)
如果你的游戏需要独占控制台接收用户输入,配置stdio: 'inherit'让子进程复用主进程的终端:
const { spawn } = require('child_process'); if (Bootup === "StartOS1") { const osProcess = spawn('node', ['OS1.js'], { stdio: 'inherit', shell: true }); osProcess.on('error', (err) => { console.error('启动失败:', err); }); }
注意事项
- 同步执行仅适合运行短时间内会结束的命令,游戏这类长期运行的进程必须用异步方式。
- 如果子进程需要和主进程通信,
fork是最佳选择,它内置了IPC通道,可以方便地发送/接收消息。
内容的提问来源于stack exchange,提问作者Devitzer123
相关产品推荐
相关产品推荐

