内容提要
postmaster.pid是Postgres启动时创建的文件,包含父进程PID、数据目录、启动时间、监听端口号、Unix套接字目录、TCP/IP接口、共享内存键和ID以及当前状态。该文件用于判断Postgres是否正在运行。
延伸解读
postmaster.pid 的定位:不只是“运行中”标志
文章指出 postmaster.pid 是信号量文件,存在即暗示 Postgres 可能正在运行,但更关键的是它作为“目录锁文件”防止多个实例同时使用同一数据目录。启动时若文件已存在,Postgres 会报错拒绝启动。因此,它不仅是状态指示器,更是数据目录的互斥锁,理解这一点有助于避免误删文件导致并发启动冲突。
PID 与端口:最实用的两行信息
八行内容中,第一行 PID 和第四行端口号最常用。PID 可用于向主进程发送信号,例如用 kill -HUP 让 Postgres 重载配置;端口号则权威地告诉客户端应连接哪个端口,尤其当配置被修改或通过命令行指定时。相比之下,数据目录行因文件总在数据目录内而价值有限,共享内存行仅用于深度调试。
多值配置的局限:套接字与监听地址只显示第一个
文章特别警告:若配置了多个 Unix 套接字目录或多个监听地址,postmaster.pid 的第五、六行只记录第一个值。例如 unix_socket_directories 设为 '/tmp, /var/run/postgresql' 时,文件只显示 /tmp。需要完整列表时,应使用 bin/postgres -D data -C unix_socket_directories 或 -C listen_addresses 查询,而非依赖该文件。
异常残留与单用户模式:文件行为的边界
若 Postgres 未正常关闭,postmaster.pid 可能残留,但其中 PID 已失效;Postgres 启动时会自动检测并删除该文件,手动删除应作为最后手段。此外,在单用户模式(--single)下,PID 为负数,套接字目录和监听地址行留空,状态行不存在,Windows 上共享内存行也为空。这些边界情况提醒读者不要将文件内容视为永远完整。
Q&A
postmaster.pid文件里每一行分别代表什么?
该文件包含八行信息,依次为:1. 父进程PID;2. 数据目录;3. 启动时间(Unix时间戳);4. 监听端口号;5. Unix套接字目录;6. 监听的TCP/IP接口;7. 共享内存键和ID;8. 当前状态(如ready)。
如何通过postmaster.pid让Postgres重新加载配置文件?
提取文件第一行的PID,然后发送HUP信号:kill -HUP $(head -1 postmaster.pid)。
postmaster.pid文件中的启动时间怎么转换成可读格式?
启动时间是自1970年1月1日以来的秒数,可用Unix命令转换:date -d @`sed -n 3p postmaster.pid` 或 date -d @`awk 3==NR postmaster.pid`。
为什么这个文件叫postmaster.pid而不是postgres.pid?
“postmaster”是Postgres早期主可执行文件的名称,后来主可执行文件改名为“postgres”,但源代码中仍大量使用“postmaster”,因此文件名保留至今。
如果Postgres没有正常关闭,postmaster.pid文件会怎样?
文件可能仍然存在,但其中的PID可能已无效。Postgres在启动时会检测并自动删除该文件,因此手动删除应是最后手段。
postmaster.pid文件中的Unix套接字目录和TCP/IP接口信息是否完整?
不完整。如果配置了多个套接字目录或多个监听地址,文件中只显示第一个。要获取完整列表,需使用命令:bin/postgres -D data -C unix_socket_directories 或 bin/postgres -D data -C listen_addresses。