这篇主要是围绕 systemd 的管理和配置,有新的认识会持续更新
一、服务管理
Centos 7 及后续版本
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
Centos 6
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
service 与 inid.d 管理服务的区别
二、服务的相关信息
先找个熟悉的服务 sshd ,看看里面都有些什么吧
详见:man systemctl
systemctl status sshd
* sshd.service - OpenSSH server daemonLoaded: 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 agoDocs: man:sshd(8)man:sshd_config(5)Main PID: 2593 (sshd)Tasks: 1Memory: 4.5MCGroup: /system.slice/sshd.service`-2593 /usr/sbin/sshd -Dsshd.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 agoactive (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.wantsls -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/ 高;
四、服务配置文件内容
systemd.service 中文手册 译者:金步国
详见: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 unit1) 意思是这个 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/off3、空白行、开头为 # 或 ; 的那一行,都代表批注 "实例化"服务 服务复用:源文件(模板文件):执行服务名称@.service执行文件:执行服务名称@范例名称.service例如:systemctl start getty@tty8.service