systemctl

此外,我们使用 systemctl status service-name 常常会看到过长的日志被截断,所以我们需要一个 -l 参数来防止truncate:

systemctl -l status service-name

列出units

  • 要检查有哪些服务已经安装,可以执行:

    systemctl list-unit-files --type service
    

输出类似:

UNIT FILE                                  STATE           VENDOR PRESET
alsa-restore.service                       static          -
alsa-state.service                         static          -
alsa-utils.service                         masked          enabled
apache-htcacheclean.service                disabled        disabled
...
  • 可以进一步列出状态是 running 的服务:

    systemctl list-units --type=service --state=running
    
  • 由于服务之间有依赖,我们可以显示出这个关系:

    systemctl list-dependencies <service_unit_file>
    

例如:

systemctl list-dependencies mysqld

显示输出类似:

mysqld.service
● ├─system.slice
● └─sysinit.target
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
...

检查失败的单元

  • 有些服务从一开始操作系统启动就是失败的,我们通过以下命令检查:

    systemctl --failed
    

输出可能类似:

UNIT               LOAD   ACTIVE SUB    DESCRIPTION
● lightdm.service    loaded failed failed Light Display Manager
● networking.service loaded failed failed Raise network interfaces

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
2 loaded units listed.

以上案例中2个没有正常启动的服务,我们可以排查

激活单元

为了在操作系统启动时运行服务,我们要激活 enable 服务。

  • 检查服务是否激活:

    systemctl is-enabled <service_unit_file>.service
    

举例:

systemctl is-enabled rsyslog.service

输出可能是 enabled

systemd-analyze

  • systemd-analyze 提供了启动过程的时间统计信息:

    systemd-analyze
    

输出显示类似:

Startup finished in 1.801s (kernel) + 15.286s (userspace) = 17.088s
graphical.target reached after 15.212s in userspace
  • 可以检查启动过程每个服务单元花费时间:

    systemd-analyze blame
    

输出类似:

5.954s NetworkManager-wait-online.service
4.822s networking.service
4.071s docker.service
2.789s hciuart.service
...

输出页面自动回行(wrap)

在使用 systemctl status 检查服务时,看到的输出内容是不回行的,观看时可以通过左右键来滚动,但是不利于直接复制内容。我们需要一次性输出所有日志内容,此时就可以使用参数 --no-pager --full ,类似于 journalctl 一样

参考