diff --git a/packages/pm/daemon.js b/packages/pm/daemon.js index 92adeba..7e9f57f 100644 --- a/packages/pm/daemon.js +++ b/packages/pm/daemon.js @@ -29,10 +29,28 @@ const { spawn } = require('child_process'); const path = require('path'); const split2 = require('split2'); const fs = require('fs') +const { tmpdir } = require('os') const ipcWritePipe = fs.createWriteStream(null, { fd: 3 }) +let ipcSocketName = process.env.GEEKGEEKRUND_PIPE_NAME +if (!ipcSocketName) { + process.env.GEEKGEEKRUND_PIPE_NAME = `geekgeekrun-d_${randomUUID()}` + ipcSocketName = process.env.GEEKGEEKRUND_PIPE_NAME +} +let ipcSocketPath +if (process.platform === 'win32') { + ipcSocketPath = `\\\\.\\pipe\\${ipcSocketName}` +} +else { + ipcSocketPath = path.join(tmpdir(), `${ipcSocketName}.sock`) + fs.writeFileSync(ipcSocketPath, '') + // 设置权限(Unix) + fs.chmodSync( + ipcSocketPath, + 0o777 + ) +} -const PORT = 12345; const workers = new Map(); // workerId -> { process, status, restartCount, socket, latestScreenshot, latestScreenshotAt } const guiClients = new Set(); // GUI客户端连接集合 const stoppedWorkers = new Set(); // 被用户主动停止的workerId集合,用于防止竞态条件 @@ -459,8 +477,8 @@ new Promise((resolve, reject) => { ) reject(err) }) - server.listen(PORT, () => { - console.log(`守护进程服务器运行在端口 ${PORT}`); + server.listen(ipcSocketPath, () => { + console.log(`守护进程服务器运行在端口 ${ipcSocketPath}`); ipcWritePipe.write( JSON.stringify({ type: 'DAEMON_READY' }), (err) => void err diff --git a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/connect-to-daemon.ts b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/connect-to-daemon.ts index 91c08e7..7eb4303 100644 --- a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/connect-to-daemon.ts +++ b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/connect-to-daemon.ts @@ -1,6 +1,7 @@ import { randomUUID } from "node:crypto"; -import { DAEMON_PORT } from "./daemon-config"; import { EventEmitter } from "node:events"; +import { tmpdir } from "node:os"; +import path from "node:path"; const net = require('net'); const split2 = require('split2'); @@ -15,7 +16,11 @@ export async function connectToDaemon() { daemonClient = new net.Socket(); let isConnected = false await new Promise((resolve, reject) => { - daemonClient.connect(DAEMON_PORT, 'localhost', () => { + const ipcSocketName = process.env.GEEKGEEKRUND_PIPE_NAME + const ipcSocketPath = process.platform === 'win32' + ? `\\\\.\\pipe\\${ipcSocketName}` + : path.join(tmpdir(), `${ipcSocketName}.sock`) + daemonClient.connect(ipcSocketPath, 'localhost', () => { isConnected = true console.log('已连接到守护进程'); daemonEE.emit('connect') diff --git a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/daemon-config.ts b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/daemon-config.ts deleted file mode 100644 index 254ac66..0000000 --- a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/daemon-config.ts +++ /dev/null @@ -1 +0,0 @@ -export const DAEMON_PORT = 12345; diff --git a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/launch-daemon.ts b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/launch-daemon.ts index 902403a..e4ae53d 100644 --- a/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/launch-daemon.ts +++ b/packages/ui/src/main/flow/OPEN_SETTING_WINDOW/launch-daemon.ts @@ -1,3 +1,4 @@ +import { randomUUID } from "crypto"; const { app } = require('electron'); const { spawn } = require('child_process'); @@ -27,6 +28,7 @@ export function launchDaemon() { // 启动守护进程 async function startDaemon() { console.log('启动守护进程...'); + process.env.GEEKGEEKRUND_PIPE_NAME = `geekgeekrun-d_${randomUUID()}` // 使用 Electron 可执行程序路径,如果没有则回退到 node const electronPath = process.execPath; console.log(`使用 Electron 路径: ${electronPath}`);