/** * pid-file.ts — PID 文件读写模块 * * Master 进程启动时将自身 PID 写入文件, * CLI 命令(vext stop / vext reload / vext status)通过读取 PID 文件 * 定位 Master 进程并发送信号。 * * PID 文件生命周期: * 1. Master 启动 → writePidFile() 写入 PID * 2. CLI 操作 → readPidFile() 读取 PID → 发送信号 * 3. Master 退出 → removePidFile() 删除文件 * * 文件格式: * - 纯文本,内容仅为 PID 数字 + 换行符 * - 默认路径:项目根目录下 `.vext.pid` * - 可通过 config.cluster.pidFile 或 VEXT_CLUSTER_PID 环境变量自定义 * * 安全性考虑: * - writePidFile 检测是否已有同名文件,若对应进程仍存活则拒绝写入(防止多实例冲突) * - removePidFile 验证文件内容与当前 PID 一致后才删除(防止误删其他实例的 PID 文件) * - 所有操作使用同步 API(启动/关闭阶段,无需异步) * * @module lib/cluster/pid-file * @see 12a-master.md §3(PID 文件) * @see 12d-deploy.md §2(PID 文件路径与多项目隔离) */ /** 默认 PID 文件路径(相对于项目根目录) */ export declare const DEFAULT_PID_FILE = ".vext.pid"; /** * PID 文件操作结果 */ export interface PidFileResult { /** 操作是否成功 */ ok: boolean; /** PID 值(读取时返回) */ pid?: number; /** 错误信息(失败时返回) */ error?: string; /** PID 文件的绝对路径 */ path: string; } /** * writePidFile — 写入 PID 文件 * * Master 启动时调用,将当前进程 PID 写入文件。 * * 冲突检测: * - 如果 PID 文件已存在,读取其中的 PID * - 检测该 PID 对应的进程是否仍存活(process.kill(pid, 0)) * - 存活 → 拒绝写入,返回错误(防止多实例冲突) * - 不存活 → 覆盖写入(上次异常退出残留的 stale PID 文件) * * @param pidFilePath PID 文件路径(绝对路径或相对于 cwd 的路径) * @param pid 要写入的 PID(默认 process.pid) * @returns 操作结果 */ export declare function writePidFile(pidFilePath?: string, pid?: number): PidFileResult; /** * readPidFile — 读取 PID 文件 * * CLI 命令(vext stop / reload / status)调用,获取 Master 进程 PID。 * * 额外验证: * - 检查文件是否存在 * - 解析内容为数字 * - 可选:验证对应进程是否存活 * * @param pidFilePath PID 文件路径 * @param checkAlive 是否验证进程存活(默认 true) * @returns 操作结果(包含 pid) */ export declare function readPidFile(pidFilePath?: string, checkAlive?: boolean): PidFileResult; /** * removePidFile — 删除 PID 文件 * * Master 优雅关闭时调用。 * * 安全措施: * - 验证文件内容与当前进程 PID 一致后才删除 * - 不一致时跳过删除(可能被其他实例覆盖) * - 删除失败不抛出异常(关闭流程不应因 PID 文件失败而中断) * * @param pidFilePath PID 文件路径 * @param expectedPid 期望的 PID(默认 process.pid),用于安全校验 * @returns 操作结果 */ export declare function removePidFile(pidFilePath?: string, expectedPid?: number): PidFileResult; /** * isProcessAlive — 检测指定 PID 的进程是否仍然存活 * * 使用 process.kill(pid, 0) 检测: * - 不发送任何信号(signal = 0 是探测信号) * - 成功 → 进程存在且当前用户有权限 * - ESRCH → 进程不存在 * - EPERM → 进程存在但无权限(仍视为存活) * * @param pid 要检测的进程 PID * @returns 进程是否存活 */ export declare function isProcessAlive(pid: number): boolean;