journalctl -u 用于按 systemd 服务单元(如 nginx.service)过滤日志,必须带 .service 后缀;查 pid 日志应使用 _pid=12345,而非 -u 或无效的 -i 选项。

journalctl -u 是用来按 systemd 服务单元(unit)过滤日志的,不能直接配合进程 ID(PID)使用。你提到的 journalctl -u -i 并不是一个有效组合——-i 不是 journalctl 的标准选项,-u 后必须跟 unit 名(如 nginx.service),而 PID 是运行时动态值,和 unit 名属于不同维度。
如果你的目标是 只显示某个特定进程 ID(PID)产生的业务日志,正确做法是用 _PID= 字段匹配,而不是 -u。以下是清晰、实用的说明:
✅ 正确方式:用 _PID= 过滤指定进程的日志
journalctl 支持内建字段匹配,其中 _PID 表示生成该日志条目的进程 ID(注意下划线开头,大小写敏感):
journalctl _PID=12345
这条命令会输出所有由 PID 12345 写入 journald 的日志(包括它调用 sd_journal_print()、logger 或 systemd-cat 产生的日志)。
⚠️ 注意:该 PID 必须是当前仍存在或刚退出但日志未轮转的进程;若进程已退出且日志被清理,可能查不到。
? 如何快速获取目标进程的 PID?
先确认你要追踪的业务进程是否在运行:
ps aux | grep myapp # 或更精准地查主进程名 pgrep -f "python server.py"
拿到 PID 后,直接代入:
journalctl _PID=8901 -n 50 --no-pager
? 补充技巧:结合时间、格式与实时跟踪
-
--since "2 min ago":只看最近两分钟 -
-o json-pretty:结构化查看,确认日志来源是否真实来自该 PID -
-f:实时追加(适合调试中正在运行的进程) -
--no-pager:避免分页,方便管道处理
例如:
journalctl _PID=8901 --since "10 min ago" -o json-pretty -f
❌ 常见误区澄清
-
journalctl -u xxx -i:-i无意义,journalctl 没有这个选项;-u只认 unit 名,不认 PID。 -
journalctl | grep "PID=12345":低效且不可靠——PID 可能出现在日志正文里,不是结构化字段,容易误匹配。 - 试图用
-u绑定一个非 service 进程(如手动./mydaemon):除非它被定义为 systemd service 并启用,否则-u查不到。
? 如果进程没有 systemd unit,但你想长期追踪它?
推荐启动时用 systemd-run 包裹,自动分配临时 unit 并记录 PID 关联:
systemd-run --scope -p "Delegate=yes" ./myapp # 然后可用 journalctl -u run-XXXXX.service 查,也可用 _PID=... 辅助验证
不复杂但容易忽略。











