Electron打包后fork子进程提前退出(错误码1)的解决方法咨询
Electron打包后子进程fork失败的解决方案
问题背景
在Electron应用中使用child_process.fork创建子进程实现任务启停功能,开发环境(VSCode)运行正常,但经electron-builder打包为exe后,子进程未执行就提前退出,无错误日志输出,推测是路径问题导致。
相关代码
index.js(主进程代码)
ipcMain.handle('run-login', async (event, args) => { const taskProcessesPath = path.join(__dirname, '../build/taskProcesses.js'); const child = fork(taskProcessesPath, [JSON.stringify({ ...args, taskType: 'login' })]); taskProcesses[args.id] = child; child.on('message', (message) => { console.log('Message From Task:', message); }); child.on('exit', (code) => { statusUpdate(args.id, 'Task Stopped', 'error'); taskGroupUpdate(args.taskGroupId, 'error'); runningUpdate(args.id, false); delete taskProcesses[args.id]; }); });
taskProcesses.js(子进程脚本)
const { login } = require('../Modules/login'); async function runTask(args) { try { switch (args.taskType) { case 'login': await login(args.taskGroupId, args.id, args.proxyGroup); break; default: throw new Error(`Unsupported task type: ${args.taskType}`); } process.send({ status: 'completed' }); process.exit(0); } catch (error) { console.error(`Error executing ${args.taskType} task:`, error); process.send({ status: 'error', error: error.message }); process.exit(1); } } if (require.main === module) { const args = JSON.parse(process.argv[2]); runTask(args); } module.exports = { runTask };
解决步骤
1. 修正子进程路径获取逻辑
Electron打包后,__dirname指向asar包内的目录,子进程无法直接运行asar内的脚本,需区分开发/生产环境获取正确路径:
const { app } = require('electron'); const path = require('path'); const fs = require('fs'); ipcMain.handle('run-login', async (event, args) => { let taskProcessesPath; const isPackaged = app.isPackaged; if (isPackaged) { // 打包后指向unpacked的目录(需配合electron-builder配置) taskProcessesPath = path.join( app.getAppPath().replace('app.asar', 'app.asar.unpacked'), 'build', 'taskProcesses.js' ); } else { // 开发环境路径 taskProcessesPath = path.join(__dirname, '../build/taskProcesses.js'); } // 验证路径有效性 console.log('子进程脚本路径:', taskProcessesPath); console.log('文件是否存在:', fs.existsSync(taskProcessesPath)); const child = fork(taskProcessesPath, [JSON.stringify({ ...args, taskType: 'login' })]); taskProcesses[args.id] = child; // 新增错误监听,捕获启动失败信息 child.on('error', (err) => { console.error('子进程启动失败:', err); statusUpdate(args.id, '启动失败', 'error'); taskGroupUpdate(args.taskGroupId, 'error'); runningUpdate(args.id, false); delete taskProcesses[args.id]; }); child.on('message', (message) => { console.log('Message From Task:', message); }); child.on('exit', (code) => { statusUpdate(args.id, 'Task Stopped', 'error'); taskGroupUpdate(args.taskGroupId, 'error'); runningUpdate(args.id, false); delete taskProcesses[args.id]; }); });
2. 配置electron-builder解压子进程相关文件
在package.json的build配置中,将子进程脚本及依赖模块排除在asar包外,确保子进程可访问:
"build": { "asar": true, "asarUnpack": [ "./build/taskProcesses.js", "./Modules/**/*" ] }
3. 子进程内部路径适配
确保子进程中require的路径在打包后仍有效,若打包后目录结构变化,需同步调整../Modules/login这类相对路径。
内容的提问来源于stack exchange,提问作者JediSZN
相关产品推荐
相关产品推荐

