/var/run 目录下的 .pid 文件核心作用是确保程序单例运行,其通过 fcntl 文件锁机制防止重复启动,并支撑服务状态判断、systemd 集成及运维操作。

/var/run 目录下的 .pid 文件,核心作用是确保程序单例运行——同一时间只允许一个实例在系统中活动。
pid文件的内容很简单
它是一个纯文本文件,只包含一行数字,就是对应进程的 PID(进程号)。比如用 cat /var/run/nginx.pid 就能看到 nginx 主进程的 ID。这个数字可直接用于 kill、ps 或 systemctl 等命令操作该进程。
防止重复启动的关键机制
程序启动时,并不只是写个数字进去,而是通过文件锁(fcntl + F_WRLCK)抢占该文件的写权限:
- 成功加锁并写入 PID 后,进程继续运行,锁保持在打开的文件描述符上
- 若已有进程持有该锁,新启动的进程会立即失败退出
- 进程意外终止或正常退出时,内核自动释放锁,无需手动清理
管理 pid 文件的实际注意事项
运维中容易忽略但影响稳定性的细节:
- pid 文件路径必须固定且唯一,如 /var/run/myapp.pid,不能动态生成
- 程序退出前必须保证该文件描述符未关闭,否则锁会提前释放
- 现代系统中 /var/run 实际是 /run 的符号链接,建议优先使用 /run(更符合 FHS 标准)
- 权限应设为 root:root 且 644 或 600,避免非特权用户篡改或删除
常见用途不止于防重
除了单例控制,pid 文件还支撑日常运维动作:
- 服务脚本通过读取 pid 文件判断服务是否正在运行
- systemd 单元文件可通过 PIDFile= 指令关联它,实现状态跟踪
- 监控工具(如 Prometheus node_exporter)可采集 pid 文件存在性作为服务健康指标
- 重启服务前,先 kill -TERM $(cat /var/run/app.pid) 是标准操作之一


















