systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl

systemctl管理服务(unit)

systemctl 提供了一组子命令来管理单个的 unit,其命令格式为:
systemctl [command] [unit]

command 主要有:
start:立刻启动后面接的 unit。
stop:立刻关闭后面接的 unit。
restart:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。
reload:不关闭 unit 的情况下,重新载入配置文件,让设置生效。
enable:设置下次开机时,后面接的 unit 会被启动。
disable:设置下次开机时,后面接的 unit 不会被启动。
status:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。
is-active:目前有没有正在运行中。
is-enable:开机时有没有默认要启用这个 unit。
kill :不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。
show:列出 unit 的配置。
mask:注销 unit,注销后你就无法启动这个 unit 了。
unmask:取消对 unit 的注销。

在此仅介绍几个常用的 target

graphical.target:就是文字界面再加上图形界面,这个 target 已经包含了下面的 multi-user.target。
multi-user.target:纯文本模式!
rescue.target:在无法使用 root 登陆的情况下,systemd 在开机时会多加一个额外的临时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。
emergency.target:紧急处理系统的错误,在无法使用 rescue.target 时,可以尝试使用这种模式!
shutdown.target:就是执行关机。
getty.target:可以设置 tty 的配置。
正常的模式是 multi-user.target 和 graphical.target 两个,救援方面的模式主要是 rescue.target 以及更严重的 emergency.target。如果要修改可提供登陆的 tty 数量,则修改 getty.target。
下面是操作 target unit 命令的格式:

systemctl [command] [unit.target]
command 有:
get-default:取得目前的 target。
set-default:设置后面接的 target 成为默认的操作模式。
isolate:切换到后面接的模式。
//查看和设置默认的 target
systemctl get-default
//切换 target
systemctl isolate multi-user.target
//在一般情况下,使用上述 isolate 的方式即可完成不同 target 的切换。不过为了方便起见,systemd 也提供了几个简单的指令用来切换操作模式
sudo systemctl poweroff # 系统关机
sudo systemctl reboot # 重新开机
sudo systemctl suspend # 进入暂停模式
sudo systemctl hibernate # 进入休眠模式
sudo systemctl rescue # 强制进入救援模式
sudo systemctl emergency # 强制进入紧急救援模式

这里简单介绍一下暂停模式与休眠模式的区别
suspend:暂停模式会将系统的状态保存到内存中,然后关闭掉大部分的系统硬件,当然,并没有实际关机。当用户按下唤醒机器的按钮,系统数据会从内存中回复,然后重新驱动被大部分关闭的硬件,所以唤醒系统的速度比较快。
hibernate:休眠模式则是将系统状态保存到硬盘当中,保存完毕后,将计算机关机。当用户尝试唤醒系统时,系统会开始正常运行,然后将保存在硬盘中的系统状态恢复回来。因为数据需要从硬盘读取,因此唤醒的速度比较慢(如果你使用的是 SSD 磁盘,唤醒的速度也是非常快的)。

检查 unit 之间的依赖性

很多服务之间是有依赖关系的,systemd 的一大亮点就是可以管理 unit 之间的依赖关系。我们可以通过下面的命令来查看 unit 间的依赖关系:
systemctl list-dependencies [unit] [–reverse]
选项 --reverse 会反向追踪是谁在使用这个 unit。

//当前运行的 target 的依赖关系
systemctl list-sockets
//使用 --reverse 选项查看 multi-user.target unit 被谁使用
systemctl list-dependencies multi-user.target --reverse

相关的目录和文件

/lib/systemd/system/ 大多数 unit 的配置文件都放在这个目录下。
/run/systemd/system/ 系统运行过程中产生的脚本,比如用户相关的脚本和会话相关的脚本。
/etc/systemd/system/ 这个目录中主要的文件都是指向 /lib/systemd/system/ 目录中的链接文件。
注意,在我们自己创建 unit 配置文件时,既可以把配置文件放在 /lib/systemd/system/ 目录下,也可以放在 /etc/systemd/system/ 目录下。
/etc/default/ 这个目录中放置很多服务默认的配置文件。
/var/lib/ 一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中,比如 docker 相关的数据文件就放在这个目录下。
/run/ 这个目录放置了好多服务运行时的临时数据,比如 lock file 以及 PID file 等等。

查看开机启动项

systemctl list-unit-files --type=service | grep enabled

通过执行命令可以获得服务列表

systemctl list-unit-files --type=service

系统日志查看

//检查上一次引导的日志
journalctl -b
journalctl -b -1 //可以复审前一次启动
journalctl -b -2 //可以复审倒数第 2 次启动
journalctl _PID=1 //以进程号为 1 的进程为例,该进程是所有其它进程的父进程。
journalctl -p err -b warning
//-r参数表示反序输出,(从新到旧)
journalctl -r
//跟踪日志文件 (读取最新条目),会实时输出最新日志
journalctl -f
//可以通过-n 或者 --lines=参数来指定显示的行数大小。
journalctl -n 数字
//显示指定时间段内发生的事件日志。 通过since和until 参数来实现。其中日期的格式是“YYYY-MM-DD HH:MM:SS”
journalctl --since “2016-08-04 20:00:00” --until “2016-08-04 20:15:00” 
//查看某些服务的日志
journalctl -u ***.service
journalctl -u httpd.service
journalctl -u httpd.service -u crond.service
//显示系统的内核日志信息
journalctl -k
journalctl --dmesg

查看哪个服务进程启动耗时最长

systemd-analyze blame