From 1c7ac42a46d801c996dd9b7442ea73d3593c7a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Sat, 17 Jan 2026 14:46:57 +0800 Subject: [PATCH] Add support to disable multi-process and named pipe via env Introduces NAPCAT_DISABLE_MULTI_PROCESS and NAPCAT_DISABLE_PIPE environment variables to allow disabling multi-process mode and named pipe connection, respectively. Also simplifies process termination logic by always using SIGKILL. --- packages/napcat-shell/napcat.ts | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/napcat-shell/napcat.ts b/packages/napcat-shell/napcat.ts index 5a759926..ae105ec8 100644 --- a/packages/napcat-shell/napcat.ts +++ b/packages/napcat-shell/napcat.ts @@ -24,9 +24,12 @@ declare global { // 判断是否为子进程(通过环境变量) const isWorkerProcess = process.env['NAPCAT_WORKER_PROCESS'] === '1'; +// 判断是否禁用多进程模式 +const isMultiProcessDisabled = process.env['NAPCAT_DISABLE_MULTI_PROCESS'] === '1'; + // 只在主进程中导入 utilityProcess let utilityProcess: any; -if (!isWorkerProcess) { +if (!isWorkerProcess && !isMultiProcessDisabled) { // @ts-ignore - electron 运行时存在但类型声明可能缺失 const electron = await import('electron'); utilityProcess = electron.utilityProcess; @@ -73,13 +76,8 @@ export async function restartWorker () { // 如果没有抛出异常,说明进程还在运行 logger.logWarn(`[NapCat] [UtilityProcess] 进程 ${workerPid} 仍在运行,强制杀掉`); try { - // Windows 使用 taskkill,Unix 使用 SIGKILL - if (process.platform === 'win32') { - const { execSync } = await import('child_process'); - execSync(`taskkill /F /PID ${workerPid} /T`, { stdio: 'ignore' }); - } else { - process.kill(workerPid, 'SIGKILL'); - } + // 使用 SIGKILL 强制终止进程 + process.kill(workerPid, 'SIGKILL'); logger.log(`[NapCat] [UtilityProcess] 已强制终止进程 ${workerPid}`); } catch (killError) { logger.logError(`[NapCat] [UtilityProcess] 强制终止进程失败:`, killError); @@ -167,8 +165,12 @@ async function startWorker () { async function startMasterProcess () { logger.log('[NapCat] [UtilityProcess] Master进程启动,PID:', process.pid); - // 连接命名管道,用于输出子进程内容 - await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); + // 连接命名管道,用于输出子进程内容(可通过环境变量禁用) + if (process.env['NAPCAT_DISABLE_PIPE'] !== '1') { + await connectToNamedPipe(logger).catch(e => logger.logError('命名管道连接失败', e)); + } else { + logger.log('[NapCat] [UtilityProcess] 命名管道已禁用 (NAPCAT_DISABLE_PIPE=1)'); + } // 启动 worker 进程 await startWorker(); @@ -225,7 +227,14 @@ async function startWorkerProcess () { } // 主入口 -if (isWorkerProcess) { +if (isMultiProcessDisabled) { + // 禁用多进程模式,直接启动 NCoreInitShell + logger.log('[NapCat] [SingleProcess] 多进程模式已禁用,直接启动核心'); + NCoreInitShell().catch((e: Error) => { + logger.logError('[NapCat] [SingleProcess] 启动失败:', e); + process.exit(1); + }); +} else if (isWorkerProcess) { // Worker进程 startWorkerProcess().catch((e: Error) => { logger.logError('[NapCat] [UtilityProcess] Worker进程启动失败:', e);