journalctl 监控服务状态的核心是将实时日志流转化为可感知的状态信号,通过 -u、-f、--no-pager、--output short-iso-precise 实现精准追踪;结合 -p 与 grep 双层过滤提取关键状态;支持多服务联动观察依赖关系;并可用 shell 实现轻量告警。

用 journalctl 监控服务状态变化,核心是把“实时日志流”变成“可感知的状态信号”。它不是简单滚动输出,而是通过过滤、高亮、组合和轻量告警,让关键状态跃然眼前。
实时追踪服务启停与状态切换
服务启动、重启、崩溃都会在 journalctl 中留下明确标记,比如 Started、Stopping、Stopped、Failed。用 -u 和 -f 组合就能盯住这些信号:
- journalctl -u nginx.service -f —— 看到 “Started nginx” 表示启动成功,“Failed with result ‘exit-code’” 则说明启动失败
- 加 --no-pager 避免分页干扰,方便复制粘贴错误行
- 搭配 --output short-iso-precise 显示毫秒级时间戳,便于比对多个服务间的时间先后顺序
只看关键状态:按优先级 + 关键词双层过滤
错误日志常混在大量 info 日志中。单靠 -p err 可能漏掉带 warning 的早期征兆,而全量 grep 又太慢。推荐两步走:
- 先用 journalctl -u mysql.service -f -p warning..err 捕获 warning 到 emerg 全段日志
- 再管道进 grep --color=auto -E "(fail|stop|refuse|timeout|cannot|denied)" 高亮语义关键词
- 例如:journalctl -u xray.service -f -p err | grep --color=auto -i "failed\|crash\|panic"
跨服务联动监控,识别依赖异常
一个服务挂了,常因上游依赖(如 network、redis、db)未就绪。journalctl 支持同时跟踪多个单元:
- journalctl -f -u api.service -u redis.service -u postgresql.service —— 所有日志混排输出,但每行自带服务名前缀,一眼看出谁先报错
- 若发现 api 启动时 redis 还在 “Activating”,说明依赖加载延迟;若 redis 日志里出现 “Connection refused”,则问题在数据库端
- 加 --all 可显示完整字段(含 _PID、_UID),方便进一步关联进程行为
轻量级终端告警:用 shell 实现“有错就闪”
不需要部署完整监控系统,几行命令就能让终端自动提醒你:
- 监听错误并触发视觉提示:journalctl -u nginx.service -f -p err | while read line; do echo -e "\a$line"; done(\a 触发终端蜂鸣)
- 监听失败事件并高亮整行:journalctl -u docker.service -f | grep --color=always -E "(Failed|Stopping.*failed|exited with code)"
- 配合 watch -n 5 定期检查状态(适合低频轮询):watch -n 5 'systemctl is-active nginx || echo "NGINX DOWN!"'

















