journalctl 可通过 _pid=1234 精准过滤指定 pid 日志,因 systemd 自动添加 _pid 字段;也可结合 -u 服务名、_comm 命令名或 --grep 文本筛选,注意权限、日志持久化及进程启动方式影响结果。

journalctl 本身不支持直接按 PID 过滤日志,因为 systemd journal 默认不将 PID 作为独立字段索引(PID 只出现在日志消息正文里)。但可以通过组合方式精准定位指定 PID 的日志,关键在于利用 _PID 字段(由 systemd 自动添加)或结合其他上下文字段过滤。
使用 _PID 字段精确匹配
systemd 在记录日志时会自动为每条日志附加 _PID 字段(注意下划线前缀),这是最可靠的方式:
- 语法:
journalctl _PID=1234(替换 1234 为实际 PID) - 支持比较操作符,例如查看该 PID 启动后的所有日志:
journalctl _PID=1234 --since "2024-01-01" - 可叠加其他条件,如只看错误级别:
journalctl _PID=1234 PRIORITY=3(3 表示 ERROR)
结合服务名或可执行路径缩小范围
如果进程由 systemd 服务管理(如 nginx、sshd),优先用服务名更稳定(PID 会变,服务名不变):
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 查服务对应的所有日志:
journalctl -u nginx.service - 再用
--grep筛选含特定 PID 的行(仅作补充):journalctl -u nginx.service | grep 'pid=1234'(注意这属于文本过滤,非结构化查询) - 查某个二进制启动的进程(如 /usr/bin/python3):
journalctl _COMM=python3(_COMM是进程命令名,不含路径)
实时跟踪新产生的 PID 日志
若进程刚启动且 PID 尚未确定,可先启动跟踪再获取 PID:
- 新开终端,运行:
journalctl -f -o short-iso(实时输出,ISO 时间格式) - 在另一终端启动目标程序,记下其 PID(如
echo $!或pgrep myapp) - 回到 journalctl 窗口,按
Ctrl+C停止,再执行:journalctl _PID=新PID
注意事项与常见问题
以下情况会导致 _PID 查询失败或结果为空:
- 进程不是由 systemd 启动(如手动在 shell 中运行的 ./app),可能缺少完整上下文,
_PID字段仍存在,但关联的_UID、_GID等字段可能受限 - 日志已轮转或被清理:检查是否启用持久日志:
sudo mkdir -p /var/log/journal并重启 journald - PID 已退出且日志未保留足够久:用
--since指定合理时间范围,避免漏掉 - 权限不足:普通用户只能查自己的日志;查系统级日志需加
sudo










