系统服务
约 1478 个字 102 行代码 8 张图片 预计阅读时间 6 分钟
Warning
系统服务的随意操作可能会带来无法预料的后果,请谨慎操作。
引入
需要长期运行的程序
比如服务器程序(Server)、数据库管理系统(DBMS)。
不可能一直放在前台运行,一旦断开 SSH 连接,程序会被终止。
还有一些程序是在开机时运行的,有一些还要常驻在后台,提供系统、网络服务。
其中一些被称之为守护进程(daemon)或服务(service)。
很多守护进程的名称会以 d
结尾。
查看名称以 d
结尾的进程
| ding@ding-server:~$ ps aux | awk 'NR != 1{print $11}' | grep -E '(.+d$|.+d\]$|.+d\:)' | sort -u
[khugepaged]
[kworker/3:1H-kblockd]
[kworker/u8:0-events_unbound]
/lib/systemd/systemd
/lib/systemd/systemd-journald
/lib/systemd/systemd-udevd
mysqld
sshd:
/usr/bin/containerd
/usr/bin/dockerd
/usr/bin/vmtoolsd
/usr/sbin/atd
/usr/sbin/rsyslogd
[watchdogd]
...
|
Linux 服务管理的变化
早期使用 System V init:
- 内核第一个调用的程序是
init
,由它启动其他的服务
- 服务脚本放在
/etc/init.d/
中,为 Shell 脚本,对服务的操作皆通过执行脚本实现
- 服务通过
service
命令操作,是否开机启动通过 chkconfig
命令管理
现在的大部分发行版使用 systemd:
- 出于兼容性考虑,功能上部分兼容 System V init,但不多
- 具体信息见后
systemd 简介
systemd 架构图,作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0):
systemd 架构图
配置文件
守护进程的执行脚本通称为服务单位(unit),每种服务单位根据功能区分时,分为不同类型。
存放目录(按优先级从高到低):
/etc/systemd/system
:管理员根据主机需求建立的服务脚本
/run/systemd/system
:系统执行过程中产生的服务脚本
/usr/lib/systemd/system
:每个服务最重要的启动脚本设置
服务单位类型的区分可看扩展名。
服务单位类型
service
:一般服务
socket
:套接字服务
target
:操作环境
mount
/ automount
:文件系统挂载相关服务
path
:检测特定文件或目录
timer
:循环执行的服务
通过 systemctl
管理服务
操作单个服务
命令:
- 需要 root 权限
start
:启动
stop
:停止
restart
:重启
reload
:重新加载配置文件(不关闭)
enable
:设置开机启动
disable
:取消开机启动
mask
:强制注销(防止被其他服务唤醒)
unmask
:取消注销
- 所有用户均可操作
status
:查看状态
is-active
:查看是否运行中
is-enable
:查看是否开机启动
查看服务状态的例子
systemctl status 的例子
服务状态
active (running)
:正在运行
active (exited)
:仅执行一次,正常结束,目前没有进程在运行
active (waiting)
:正在运行,但需等待其他事件发生
inactive
:没有运行
服务默认状态
enabled
:开机启动
disabled
:开机不启动
static
:不可以开机启动,不过可能被其他服务唤醒
mask
:被强制注销,无法启动
停止服务的例子
| ding@ding-server:~$ sudo systemctl stop atd.service
# 操作服务时,如果无输出则一般没有问题;如果有输出,请查看输出信息
ding@ding-server:~$ systemctl status atd.service
● atd.service - Deferred execution scheduler
Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2022-06-01 17:20:45 CST; 2s ago
Docs: man:atd(8)
Process: 824 ExecStart=/usr/sbin/atd -f (code=exited, status=0/SUCCESS)
Main PID: 824 (code=exited, status=0/SUCCESS)
May 23 13:59:39 hcm0153 systemd[1]: Starting Deferred execution scheduler...
May 23 13:59:39 hcm0153 systemd[1]: Started Deferred execution scheduler.
Jun 01 17:20:45 hcm0153 systemd[1]: Stopping Deferred execution scheduler...
Jun 01 17:20:45 hcm0153 systemd[1]: atd.service: Succeeded.
Jun 01 17:20:45 hcm0153 systemd[1]: Stopped Deferred execution scheduler.
|
查看系统上所有服务
结构如图:
systemctl 查看系统上所有服务 命令结构
systemctl list-units
示例
systemctl list-units 示例
systemctl list-unit-files
示例
执行结果
各列:
- 单位文件名称
- 服务默认状态
- 发行方预设?(CentOS 无此列)
操作环境(target unit)
简述
是一群单位的集合,执行操作环境就是执行这一群单位。
比较重要的环境:
graphical.target
:命令加上图形界面(最常用)
multi-user.target
:纯命令行模式
rescue.target
:恢复模式
emergency.target
:紧急恢复模式,紧急处理系统错误的模式
shutdown.target
:关机模式
getty.target
:限制 tty 数量的模式
systemctl
操作环境操作
- 所有用户均均可操作
get-default
:获取当前环境
set-default 操作环境
:设置默认操作环境为给定操作环境
- 仅限 root 用户操作
isolate 操作环境
:切换到给定操作环境
poweroff
:关机
reboot
:重启
suspend
:挂起数据放在内存,关闭大部分硬件,唤醒后很快恢复
hibernate
:休眠数据放在硬盘,关机,再开机恢复
rescue
:强制进入恢复模式
emergency
:强制进入紧急恢复模式
分析依赖性
systemctl
分析各服务之间的依赖性
命令结构:
命令结构
示例
自己写服务配置文件
普通服务配置文件格式示例
以 ssh.service
为例:
| [Unit]
Description=OpenBSD Secure Shell server # 简易说明
Documentation=man:sshd(8) man:sshd_config(5) # 文档信息
After=network.target auditd.service # 在哪个守护进程启动后启动(非强制)
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh # 启动脚本的环境配置文件
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS # 实际执行此守护进程的命令或程序
ExecReload=/usr/sbin/sshd -t # systemctl reload 时的命令
ExecReload=/bin/kill -HUP $MAINPID # 同上,不过会替换上面的
KillMode=process # 终止进程的模式
Restart=on-failure # 自动重启条件
RestartPreventExitStatus=255
Type=notify # 守护进程启动方式
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target # 依附于哪个操作环境
Alias=sshd.service # 别名
|
多个单位用空格分开;等号左右不能有空格;等号后无内容表示空值。
一个简单的例子 - 将 ping
写为服务
/etc/systemd/system/ping.service
内容:
| [Unit]
Description=ping service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/bin/ping -i 10 192.168.1.100
[Install]
WantedBy=multi-user.target
|
| ding@ding-server:~$ sudo systemctl start ping.service
ding@ding-server:~$ systemctl status ping.service
● ping.service - ping service
Loaded: loaded (/lib/systemd/system/ping.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2022-06-02 11:44:50 CST; 15s ago
Main PID: 2669998 (ping)
Tasks: 1 (limit: 19105)
Memory: 312.0K
CGroup: /system.slice/ping.service
└─2669998 /usr/bin/ping -i 10 192.168.1.100
Jun 02 11:44:50 hcm0153 systemd[1]: Started ping service.
Jun 02 11:44:50 hcm0153 ping[2669998]: PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
Jun 02 11:44:50 hcm0153 ping[2669998]: 64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.441 ms
Jun 02 11:45:00 hcm0153 ping[2669998]: 64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.329 ms
|
重载服务配置
在修改配置文件后,最好执行下面的语句:
| sudo systemctl daemon-reload
|
系统服务日志
journalctl
- 查看系统服务日志
选项:
-n 整数
:显示最近几行;如不填整数,为 10
-f
:滚动显示最新日志
_PID=进程ID
:查看指定进程的日志
_UID=用户ID
:查看指定用户的日志
-u 单位名
:查看指定单位的日志
-o 格式
:以给定格式输出(如 json-pretty
)
- `--since 表时间的字符串:指定开始时间
--until
表时间的字符串:指定结束时间
--no-pager
:改为标准输出,不分页输出
-x
:显示更详细的解释信息
-e
:直接跳到最后一页
例:
查看系统服务日志 - 例
一些保留与替代命令
service
可以做普通服务的启停、重启、重载、查看(实质上调用了 systemctl
):
| service 不带扩展名的服务名 start|stop|restart|reload|status
|
除 status 外,其他均要求 root 权限。
chkconfig
CentOS 7.9 中仍然保留。
可以设置、查看(不带最后一个选项)服务的开机启动与否:
| sudo chkconfig 不带扩展名的服务名 [on|off]
|
下面的命令只能查看 System V 形式的服务的启用信息:
| ding@ding-server:~$ chkconfig --list
Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'.
jexec 0:off 1:on 2:on 3:on 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
|
关机和重启相关的命令
除 sync
外,通过 SSH 执行下面的命令均需要 root 权限;对普通用户,sync
只能同步自己的文件。
| sync # 同步内存中的暂存文件到磁盘,建议关机前操作
reboot # 重启
halt # 停机,屏幕可能会显示停止的信息
poweroff # 关机
shutdown # 一分钟之后关机
shutdown -r # 重启
shutdown -h now # 立即关机
shutdown -h +10 # 10 min 后关机
shutdown -r 20:00 "提示信息" # 20:00 重启,按回车键后发送信息给其他终端
shutdown -c # 取消关机任务
|
拓展
参考资料