You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:35:29