systemd
是 Linux
系统的一种 中央化系统及设置管理程序(init)
,包括有守护进程
、程序库
以及应用软件
组成。目标是解决系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低系统的开销。
历史
在旧的 Linux
中,服务启动一直采用 init
进程。如:
$ /etc/init.d/apache2 start
$ service apache2 start
缺点如下:
- 启动时间长:串行启动进程
- 启动脚本复杂:
init
进程只是执行启动脚本,不管其他事情,因此脚本需要处理各种异常情况
介绍
在 Unix
中通常以 d
作为系统 守护进程(daemon)
的后缀标识。Systemd
就是它要守护整个系统的进程,因此其 pid
为 1
。
$ systemctl --version
systemd 215
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
$ pstree 1
systemd─┬─AliSecGuard───6*[{AliSecGuard}]
├─AliYunDun───23*[{AliYunDun}]
...
常见 systemd 文件:
- Service units: 以
.service
结尾的配置文件,记录由 systemd 控制和监督的进程的信息
- Socket units: 以
.socket
结尾的配置文件,编码包括 IPC 或网络套接字 Socket
或文件系统FIFO
的信息,用于 socket 的激活,由 systemd 控制和监督,如 systemctl cat docker.socket
- Target units: 以
.target
结尾的配置文件,编码 systemd 目标单元的信息,用于单元分组和启动时作为同步点
使用
systemctl
systemd-analyze
# 查看启动耗时
$ systemd-analyze
# 查看每个服务的启动耗时
$ systemd-analyze blame
# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
hostnamectl
# 主机的信息
$ hostnamectl
# 设置主机名
$ hostnamectl set-hostname cn-xiexianbin
loginctl
# 查看当前登录的用户
$ loginctl list-sessions
$ loginctl list-users
$ loginctl show-user root
journalctl
journalctl
用于管理日志
- 配置文件:
/etc/systemd/journald.conf
- 服务:
systemctl status systemd-journald.service
# 查看启动所有日志
$ sudo journalctl
# 查看内核日志
$ sudo journalctl -k
# 查看本次启动的日志
$ sudo journalctl -b
# 查看上一次启动的日志
$ sudo journalctl -b -1
# 查看指定时间的日志
$ sudo journalctl --since="2019-11-16 12:00:00"
$ sudo journalctl --since "10 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2019-11-15" --until "2019-11-16 12:00:00"
# 显示最新 10 行的日志
$ sudo journalctl -n
# 显示指定行数的日志
$ sudo journalctl -n 20
# 实时滚动显示最新日志
$ sudo journalctl -f
# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd
# 查看指定进程的日志
$ sudo journalctl _PID=1
# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash
# 查看指定用户的日志
$ sudo journalctl _UID=88 --since today
# 查看某个 Unit 的日志
$ sudo journalctl -u tengine.service
$ sudo journalctl -u tengine.service --since today
# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u tengine.service -f
# 合并显示多个 Unit 的日志
$ journalctl -u tengine.service -u chrony.service --since today
日志 Suppressed 问题
Nov 16 10:21:14 cn-xiexianbin journal: Suppressed 1422 messages from /system.slice/tengine.service
解决方法:
- 修改
/etc/systemd/journald.conf
[Journal]
RateLimitBurst=5000 # 1000
systemctl restart systemd-journald.service