这篇主要是围绕 systemd 的管理和配置,有新的认识会持续更新
systemd
# 无需重启,重新加载服务 一般用于配置文件变更后
systemctl reload daemon
# 服务的开机自启动管理
systemctl enable/disable daemon
# 服务状态的管理
systemctl start/status/stop/restart daemon
# 服务的依赖关系
systemctl list-dependencies daemon
不常用:
# 获取当前模式
systemctl get-default
# 设置为纯文本模式
systemctl set-default multi-user.target
# 临时切换到文本模式
systemctl isolate multi-user.target
# 临时切换到UI模式
systemctl isolate graphical.target
# 禁用服务或者解除禁用
systemctl mask/unmask daemon
# 可以显示目前的所有服务状态
systemctl
# 帮助文档
man systemctl
异常的服务可能会影响系统开机和关机的时长,如果发现开机或者关机时间过长,建议检查启动日志以及开机后服务状态
# 查看系统启动日志 默认位置
more /var/log/boot.log
# 可以查看失败的服务
systemctl |grep failed
initd
# 服务状态维护
service daemon start/stop/restart/status
# 服务的自启管理
chkconfig daemon on/off
# 查看服务列表
chkconfig --list daemon
# 服务状态管理,service 无法控制服务时,可以试试这个
/etc/init.d/daemon start/stop/restart/status
# 帮助文档
man service
先找个熟悉的服务 sshd ,看看里面都有些什么吧
详见:man systemctl
systemctl status sshd
* sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 2593 (sshd)
Tasks: 1
Memory: 4.5M
CGroup: /system.slice/sshd.service
`-2593 /usr/sbin/sshd -D
sshd.service - OpenSSH server daemon # 服务名称 和 注解
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
loaded # 已加载
/usr/lib/systemd/system/sshd.service # 服务配置文件路径
enabled # 开机自启,优先级比系统预设高
vendor preset: enabled # 系统预设自启
Active: active (running) since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago
active (running) # 活动状态正常
since Wed 2020-12-30 16:28:12 CST; 3 months 21 days ago # 服务启动时间
-2593 /usr/sbin/sshd -D
-2593 # PID进程号2593
/usr/sbin/sshd -D # 服务执行的命令
Loaded 状态:
enabled # 开机自启
disabled # 没有开机自启
static # 不可以自启,但是可以让其他服务唤醒
mask # 不能启动,因为被注销,systemctl unmask daemon可以恢复
Active 状态:
active (running) # 正常
active (exited) # 仅执行一次就正常结束,目前没有正在运行,无需一直执行
active (waiting) # 正在运行中,在等待其他时间才能处理
inactive (dead) # 没有运行的服务,一般是stop或者起不来的情况
service通过daemon程序来实现服务,例如sshd.service 的daemon是sshd程序
自启服务:/etc/systemd/system/
# 部分内容
ls -l /etc/systemd/system/
total 8
drwxr-xr-x. 2 root root 57 Jun 3 2020 basic.target.wants
lrwxrwxrwx. 1 root root 9 Jun 4 2020 ctrl-alt-del.target -> /dev/null
lrwxrwxrwx. 1 root root 37 Jun 4 2020 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root 87 Jun 3 2020 default.target.wants
drwxr-xr-x. 2 root root 4096 Sep 18 09:31 multi-user.target.wants
ls -l /etc/systemd/system/multi-user.target.wants/sshd.service
lrwxrwxrwx 1 root root 36 Dec 14 17:03 sshd.service -> /usr/lib/systemd/system/sshd.service
# systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/sshd.service.
# systemctl enable sshd
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd.service to /usr/lib/systemd/system/sshd.service.
从上述内容可以看出来,这个目录内是大量的服务的软连接文件,里面存放需要自启的服务
实际服务配置文件:
systemd 存放服务配置>> /usr/lib/systemd/system/
init.d 存放脚本,旧版本系统>> /etc/init.d
# ls /usr/lib/systemd/system/sshd*
sshd-keygen.service sshd.service sshd@.service sshd.socket
常见服务类型:
.service : 一般服务类型,也称unit
.socket : 内部程序数据交换的插槽服务,主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能
这种类型的服务通常在监控讯息传递的插槽文件,当有透过此插槽文件传递讯息来说要链接服务时,
就依据当时的状态将该用户的要求传送到对应的 daemon, 若 daemon 尚未启动,则启动该
daemon 后再传送用户的要求。
.target : 执行环境类型 (target unit),其实是一群 unit 的集合
.mount/.automount : 文件系统挂载相关的服务
.path : 侦测特定文件或目录类型,比如打印服务
.timer : 循环执行的服务,是由 systemd 主动提供的,比 anacrontab 更加有弹性
系统执行过程中所产生的服务脚本
/run/systemd/system/
# ls /run/systemd/system/
.slice : 暂不清楚
.scope : 暂不清楚
/usr/lib/systemd/system/
每个服务最主要的启动脚本设定,有点类似以前的/etc/init.d 底下的脚本文件;
/run/systemd/system/
系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高;
/etc/systemd/system/
管理员依据主机系统的需求所建立的执行脚本,执行优先序又比 /run/systemd/system/ 高;
详见:man systemd-system.conf
[Unit] unit 的说明
Description 服务的简单说明
Documentation 相关文档位置:配置文件、说明文件等
After 说明启动顺序,没有强制要求启动
Before 说明启动顺序,没有强制要求启动
Requires 设置依赖服务,** 强制要求依赖服务启动才能启动 **
Wants 说明相关服务,没有强制要求启动
Conflicts 冲突服务设定,相斥服务
[Service] 这个项目内主要在规范服务启动的脚本、环境配置文件档名、重新启动的方式等等
*Type 说明这个 daemon 启动的方式,会影响到 ExecStart 必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一
*simple 默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中
*forking 由 ExecStart 启动的程序透过 spawns 延伸出其他子程序,来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运作。
*oneshot simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus 与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运作!因此设定这个项目时,通常也要设定 BusName= 才行,会自动添加 Requires=dbus.socket 与 After=dbus.socket 依赖
idle 与 simple 类似,意思是,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才执行即可的服务!
EnvironmentFile 可以指定启动脚本的环境配置文件或者多个不同的 Shell 变量
*ExecStart 就是实际执行此 daemon 的指令或脚本程序
1) ExecStartPre (之前) 可以指定启动前的额外参数
2) ExecStartPost (之后) 可以指定启动后的额外参数
3) 不支持特殊字符,要使用得写入脚本中
4) Type=oneshot时,可以使用较为完整的bash语法
ExecStop systemctl stop 的执行有关,关闭此服务时所进行的指令
ExecReload systemctl reload 有关的指令行为
Restart Restart=1时,服务终止后会重启,除非用systemctl强制关闭
RemainAfterExit RemainAfterExit=1 时,当daemon所属程序终止后,服务再尝试重启对oneshot服务有帮助
TimeoutSec 设置非正常启动或关闭状态下,多久进入强制结束,为避免一些服务会影响系统正常关机,还是考虑添加这个参数
KillMode
process 当daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令)
control-group 由此 daemon 所产生的其他 control-group 的程序,也都会被关闭
none 没有程序会被关闭
RestartSec 关闭然后重新启动,sleep多久后再重启,默认100ms,实测没有发现延迟
[Install] 就是将此 unit 安装到哪个 target 里面去的意思
WantedBy 这个设定后面接的大部分是 *.target unit
1) 意思是这个 unit 本身是附挂在哪一个 target unit 底下
2) 一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 底下
Also 当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思
Alias 进行一个连结的别名的意思
1) 当 systemctl enable 相关的服务时,则此服务会进行连结档的建立
2) 例如multi-user.target 与default.target的关系
[Socket] 不同的 unit type 就得要使用相对应的设定项目
[Timer] 这五个都是服务类型,内容是一样的
[Mount]
[Path]
内容规则:
1、设定项目通常是可以重复的,后面设定会覆盖前面的设置,例如同时两个After,只有后面那个After会生效
2、设定参数是布尔类型时,可以使用 1/0, yes/on, true/false, on/off
3、空白行、开头为 # 或 ; 的那一行,都代表批注
"实例化"服务 服务复用:
源文件(模板文件):执行服务名称@.service
执行文件:执行服务名称@范例名称.service
例如:systemctl start getty@tty8.service