systemd 是 Linux 系统中最新的初始化系统 (init), systemd 和 upstart 是竞争对手, ubantu 上使用的是 upstart 的启动方式, Centos 7 上使用 systemd.
systemctl 是管理服务的主要工具, 它整合了 chkconfig 与 service 功能于一体。
system: 系统启动和服务器守护进程管理器, 负责在系统启动或运行时, 激活系统资源, 服务器进程和其他进程, 字母 d 是守护进程 (daemon) 的缩写, systemd 这个名字的含义就是它要守护整个系统。
服务
systemctl is-enabled nginx.service # 查询服务是否开机启动
systemctl is-active nginx.service # 查询某服务当前激活的状态, 如果启动会显示 active, 否则会显示 unknown
systemctl enable nginx.service # 开机运行服务
systemctl disable nginx.service # 取消开机运行
systemctl start nginx.service # 启动服务
systemctl stop nginx.service # 停止服务
systemctl restart nginx.service # 重启服务
systemctl try-restart nginx.service # 已启动才重启, 否则不做任何操作
systemctl reload-or-try-restart nginx.service # 先加载, 然后再启动
systemctl reload nginx.service # 重新加载服务配置文件
systemctl status nginx.service # 查询服务运行状态
systemctl kill nginx.service # 杀死进程
系统
systemctl reboot # 重启机器
systemctl [ poweroff | halt ] # 关机
systemctl suspend # 挂起-睡眠-保存在內存
systemctl hibernate # 休眠-断电-保存在硬盘
systemctl hybrid-sleep # 混合休眠模式 (同时休眠到硬盘并挂起)
systemctl rescue # 强制进入救援模式
systemctl emergency # 强制进入紧急救援模式
systemctl is-active [unit type] # 查看服务是否运行
systemctl is-enable [unit type] # 查看服务是否设置为开机启动
systemctl mask [unit type] # 注销指定服务
systemctl unmask [unit type] # 取消注销指定服务
systemctl list-units # 列出所有启动 unit
systemctl list-unit-files # 列出所有启动文件 systemctl list-unit-files | grep firewalld
systemctl list-units -t service -all # 列出所有 service 类型的 unit
systemctl list-units -t service -all grep cpu # 列出 cpu电源管理机制的服务
systemctl list-units -t target -all # 列出所有 target
systemctl get-default # 获得当前的运行级别
systemctl set-default multi-user.target # 设置默认的运行级别为 mulit-user
systemctl isolate multi-user.target # 在不重启的情况下, 切换到运行级别mulit-user 下
systemctl isolate graphical.target # 在不重启的情况下, 切换到图形界面下
systemctl daemon-reload # 重新载入 systemd, 扫描新的或有变动的单元
systemctl -t help # 查看 Unit 类型
systemctl --failed # 显示启动失败的服务
systemctl list-dependencies # 查看服务的依赖关系
配置文件位置
/usr/lib/systemd/system
每个服务最主要的启动脚本设置, 类似于之前的 /etc/initd.d
/run/system/system
系统执行过程中所产生的服务脚本, 比上面的目录优先运行
/etc/system/system
管理员建立的执行脚本, 类似于/etc/rc.d/rcN.d/Sxx
类的功能, 比上面目录优先运行, 在三者之中, 此目录优先级最高
服务状态
systemctl list-units -t service -a 显示状态
loaded: unit 配置文件已处理
active (running): 一次或多次持续处理的运行
active (exited): 成功完成一次性的配置
active (waiting): 运行中, 等待一个事件
inactive: 不运行
enabled: 开机启动
disabled: 开机不启动
static: 开机不启动, 但可以被另一个启用的服务激活
运行级别
unit 配置文件: 以 .target
结尾的文件
systemctl list-unit-files -t target -all
0 -> runlevel0.target, poweroff.target
1 -> runlevel1.target, rescue.target
2 -> runlevel2.target, muti-user.target
3 -> runlevel3.target, mutil-user.target
4 -> runlevel4.target, multi-user.target
5 -> runlevel5.target, graphical.target
6 -> runlevel6.target, reboot.target
Unit 类型
查看 Unit 类型
# systemctl -t help
Available unit types:
service # 定义系统服务
socket # 标识进程间通信用的 socket 文件, 也可以在系统启动时, 延迟启动服务, 实现按需启动
busname #
target # 模拟实现 "运行级别"
snapshot # 系统快照
device # 定义内核识别的设备
mount # 定义文件系统挂载点
automount # 文件系统的自动挂载点如: /misc 目录
swap # 表示 swap 设备
timer # 由 systemd 管理的计时器
path # 定义文件系统中的一个文件或目录使用, 常用于当文件系统变化时, 延迟激活服务, 如 spool 目录
slice #
scope #
Unit 文件格式
以 #
开头的行后面的内容会被认为是注释
布尔值
- 开启:
1
、yes
、on
、ture
- 关闭:
0
、no
、off
、false
时间单位默认是 秒
Unit 文件组成
[Unit]
: 定义 Unit 描述, 启动顺序, 依赖关系[Service]
: 与特定类型相关的专用选项, 此处为Service类型[Install]
: 定义由systemctl enable
及systemctl disable
命令在实现服务启用或禁用时用到的一些选项
[Unit] 选项
Description
: 描述信息before
: 在哪些服务前启动After
: 定义服务的启动次序, 表示当前服务应该晚与哪些服务启动, 其功能与before
相反Requires
: 依赖到的其他服务, 强依赖, 被依赖的服务无法激活时, 当前服务即无法激活Wants
: 依赖到的其他服务, 弱依赖Conflicts
: 定义服务间的冲突关系
[Service] 选项
Type
: 服务启动类型simple
: 默认值, 这个daemon
主要由ExecStart
参数的命令行来启动, 启动后常驻于内存中forking
: 由ExecStart
启动的程序透过spawns延伸出其他子程序来作为此daemon
的主要服务。原生父程序在启动结束后就会终止onshot
: 用于执行一项任务, 随后立即退出的服务, 不会常驻于内存中notify
: 与simple
相同, 但约定服务会在就绪后向systemd
发送一个信号, 需要配合NotifyAccess
来让systemd
接收消息idle
: 与simple
类似, 要执行这个daemon
必须要所有的工作都顺利执行完毕后才会执行。这类的daemon
通常是开机到最后才只能激活的服务
User
: 用户Group
: 用户组EnvironmentFile
: 环境配置文件ExeStart
: 指明启动服务要运行命令或脚本的绝对路径ExeStartPre
: 在ExecStart
前运行ExeStartPost
: 在ExecStart
后运行ExecStop
: 停止服务运行的命令或脚本Restart
: 当设定Restart=1
时, 则服务意外终止后, 总是自动重新启动此服务
[Install] 选项
Alias
: 别名, 可使用systemctl command Alial.service
RequiredBy
: 被哪些服务所依赖, 强依赖WantedBy
: 被哪些服务所依赖, 弱依赖Also
: 安装本服务的时候还要安装别的相关服务
例子
# vim /etc/systemd/system/transmission.service
[Unit]
Description=Transmission Service
After=network.target
[Service]
LimitNOFILE=666666
User=user
Group=user
ExecStart=/usr/bin/transmission-daemon --log-error -f
ExecStop=/usr/bin/killall -w -s 9 /usr/bin/transmission-daemon
[Install]
WantedBy=multi-user.target
普通用户模式
systemd 支持普通用户定义的 unit[s] 开机启动
--user
不可省略, 因为默认是执行 systemctl [--system]
, 对于系统级 unit[s]
来说, 不必显式添加 --system
选项
systemctl --user enable/disable/start/stop/daemon-reload xxx.timer/xxx.service
用户自定义的 unit[s] 可以放置在如下四个位置 (按优先级从低到高排序)
/usr/lib/systemd/user/
这里存放的是各个软件包安装的服务。~/.local/share/systemd/user/
这里存放的是HOME目录中已安装的软件包的单元。/etc/systemd/user/
这里存放的是由系统管理员维护的系统范围的用户服务。~/.config/systemd/user/
这里存放的是用户自身的服务。
- 用户级 unit 与系统级 unit 相互独立, 不能互相关联或依赖
- 用户级 unit 运行环境用
default.target
, 系统级通常用multi-user.target
- 即使用户不登陆, 其定制的服务依然会启动