journalctl -u 不支持直接按时间段检索服务状态,但可通过 --since 和 --until 精准筛选日志,结合 grep 提取 started、failed 等状态行,并需启用持久化存储以保障日志可用性。

journalctl -u 本身不直接支持“按时间段检索服务运行状态”,但可以结合时间参数精准筛选指定服务在某段时间内的日志(含启动、停止、崩溃、重载等状态变化)。关键在于用对时间选项和单位,并理解 systemd 日志中“状态”的体现方式(如 Started、Stopped、Starting、Failed 等)。
用 --since 和 --until 定义时间段
这是最常用、最可靠的方式。时间格式灵活,支持自然语言和 ISO 格式:
journalctl -u nginx --since "2024-05-20 09:00:00" --until "2024-05-20 17:30:00"-
journalctl -u sshd --since "2 hours ago"(查最近2小时) journalctl -u docker --since "yesterday" --until "today"journalctl -u mysql --since "2024-05-15" --until "2024-05-16 08:00"
快速定位服务启停与异常状态行
日志里真正反映“运行状态”的通常是 unit 的单元事件,不是普通应用输出。可配合 grep 提炼关键状态动词:
journalctl -u postfix --since "1 day ago" | grep -E "(Started|Starting|Stopped|Stopping|Failed|Reload)"journalctl -u apache2 --since "30 minutes ago" -n 100 --no-pager | grep -i "state\|fail\|exit\|start\|stop"- 加
-o short-iso让时间更易读:journalctl -u redis -o short-iso --since "2024-05-20"
查看服务最近一次启动/失败的完整上下文
有时只需看最后一次状态变更,可用 --unit + --reverse + -n 快速回溯:
-
journalctl -u cron --reverse -n 50 | grep -A 3 -B 1 -i "started\|failed\|exited"(倒序取50行,匹配后带前后文) -
journalctl -u fail2ban --since "1 hour ago" --no-pager | tail -n 20(查最近一小时末尾20行,常含最新状态)
注意持久化与时间精度问题
默认 journal 日志可能未持久保存,重启后旧日志丢失。确保已启用持久存储:
- 运行
sudo mkdir -p /var/log/journal - 确认
/etc/systemd/journald.conf中有Storage=persistent(取消注释并重启 journald:sudo systemctl restart systemd-journald) - 时间精度默认为秒级,无法精确到毫秒;若需高精度排查,建议搭配服务自身日志(如
/var/log/nginx/error.log)交叉验证
不复杂但容易忽略:时间参数必须写在 -u 后面,且 --since 和 --until 是独立开关,不能合并缩写(比如不能写成 -S 或 --since=... 带等号反而可能报错,推荐空格分隔)。











