systemd不直接统计服务重启次数,但可通过journalctl分析日志获取:统计“started”行数得启动总次数,结合“failed”“stopped”等上下文识别异常重启,并用systemctl show检查restart和startlimit相关配置。

systemd 本身不直接提供“服务历史重启次数”的内置统计功能,但可以通过日志分析和状态追踪间接获取。关键在于:systemd 会把每次服务启动、停止、崩溃、自动重启等事件完整记入 journal,而 journalctl 是唯一可靠的数据来源。
用 journalctl 统计服务的启动/重启次数
systemd 将每次服务单元(unit)的启动视为一次“activation”,包括手动启动、开机自启、崩溃后自动重启、定时器触发等。可通过以下命令统计某服务在指定时间范围内的启动总次数:
-
统计最近 7 天内所有启动记录数:
journalctl -u nginx.service --since "7 days ago" | grep "Started nginx" | wc -l -
统计自系统上次启动以来的启动次数:
journalctl -b -u nginx.service | grep "Started " | wc -l -
区分“正常启动”与“因崩溃触发的重启”:
查看失败后自动重启的典型模式(如 service 被 kill 或 segfault):
journalctl -u nginx.service --since "30 days ago" | grep -E "(Starting|Started|Stopping|Stopped|Failed|killed|segfault)"
注意观察 “Started” 前是否紧邻 “Stopped” 或 “Failed” —— 这类连续出现往往代表一次非计划重启。
检查服务是否配置了自动重启策略
重启频次高,往往源于 unit 文件中启用了自动重启机制。运行以下命令确认关键配置项:
- systemctl show nginx.service | grep -E "(Restart=|StartLimit.*)"
- 重点关注:
Restart=on-failure(默认常见)、RestartSec=10(重启间隔)、StartLimitIntervalSec=600 和 StartLimitBurst=5(10分钟内最多允许5次启动) - 若看到 StartLimitBurst=0,说明该服务被 systemd 主动限制了重启次数,后续启动会被拒绝并记录为 “start request repeated too quickly”
查看服务崩溃与重启关联线索
单纯数“Started”可能高估真实故障次数(比如 reload 不触发新 Started)。更准的方法是结合退出状态和原因定位异常重启:
- systemctl status nginx.service —— 查看最后退出状态(如 code=dumped, signal=SEGV)和 “Status:” 行中的提示
- journalctl -u nginx.service -n 50 -o short-precise —— 显示最近50行,带毫秒级时间戳,便于比对崩溃与重启的时间差
- 若服务由 systemd socket 激活,还需查对应 socket 单元日志:
journalctl -u nginx.socket
补充:uptime 与 who -b 仅反映系统级重启
注意:uptime 和 who -b 只显示整个系统的最后一次启动时间,无法反映某个服务自身的重启行为。它们对排查服务级异常无直接帮助,但可用于交叉验证:如果服务重启时间早于系统启动时间,说明日志已被轮转或 journal 存储受限(需检查 journalctl --disk-usage)。











