服务起不来时,先看这一次启动的日志,不要一上来就翻整个 /var/log。systemd 管的服务,日志在 journal 里,用 journalctl -u 按单元过滤。
把下面的 nginx.service 换成实际单元名。不确定名字时,用 systemctl list-units --type=service --state=failed 看失败的单元。
当前状态
1 | systemctl status nginx.service --no-pager |
这里能看到是不是 failed,主进程的退出码,以及最近几行日志。退出码 status=1/FAILURE 只说明进程自己返回了失败,具体原因还在 journal 里。
这一次启动的日志
1 | journalctl -u nginx.service -b --no-pager |
-b 只看本次启动。输出太长就加 -n 80,或者只要错误:
1 | journalctl -u nginx.service -b -p err --no-pager |
-p err 会把 emerg、alert、crit、err 都算进去。配置写错、端口被占用,通常在这几行里。警告被滤掉时,把 -p err 去掉再看一遍。
要看某个时间之后的:
1 | journalctl -u nginx.service --since "30 min ago" --no-pager |
单元文件本身
日志里如果是「找不到文件」「权限不够」「Address already in use」,对照单元里实际执行的命令:
1 | systemctl cat nginx.service |
FragmentPath 会写出单元文件在哪。ExecStart 是真正跑的程序。改的是 /etc/systemd/system/ 里的覆盖文件时,cat 会把 drop-in 也打出来。改完要 sudo systemctl daemon-reload,再启动。
上一启动的日志不在
journalctl -b -1 提示没有数据,说明 journal 没有留住上次开机的记录。看现在占了多少、存在哪:
1 | journalctl --disk-usage |
/etc/systemd/journald.conf 里的 Storage= 为 auto 时,存在 /var/log/journal 才会落盘。目录不在,重启后本次之前的日志就没了。需要保留时再改 Storage=persistent 并建立这个目录,然后 sudo systemctl restart systemd-journald。这只影响以后的日志,找不回已经丢掉的那一次。