腾讯课堂视频链接
文档配套视频讲解链接地址
- 腾讯课堂视频链接地址 : 51_Shell编程_Shell变量1
- 腾讯课堂视频链接地址 : 52_Shell编程_read与test命令2
- 腾讯课堂视频链接地址 : 53_Shell编程_小节复习3
- 腾讯课堂视频链接地址 : 54_Shell编程_控制语句4
- 腾讯课堂视频链接地址 : 55_Shell编程_小节复习-行业热点教程5
- 腾讯课堂视频链接地址 : 56_Shell编程_Shell函数6
第13章 系统服务管理
13.1 由来
历史上Linux的启动一直采用init进程,下面的命令用来启动服务。
$ sudo /etc/init.d/apache2 start
#或者
$ service apache2 start
这种方法有两个缺点:
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
13.2 Systemd概述
Systemd就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案,根据Linux惯例,字母d是守护进程(daemon)的缩写,Systemd这个名字的含义,就是它要守护整个系统。
(上图为Systemd作者Lennart Poettering)
使用了Systemd,就不需要再用init了。Systemd取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
# systemctl --version #命令查看Systemd的版本。
linux@ubuntu:~$ systemctl --version
systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid
linux@ubuntu:~$
Systemd的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反”keep simple, keep stupid”的Unix哲学。
(上图为Systemd架构图)
13.3 系统管理
Systemd并不是一个命令,而是一组命令,涉及到系统管理的方方面面。
1 systemctl 是Systemd的主命令,用于管理系统
#重启系统
$ sudo systemctl reboot
#关闭系统,切断电源
$ sudo systemctl poweroff
#CPU停止工作
$ sudo systemctl halt
#暂停系统
$ sudo systemctl suspend
#让系统进入冬眠状态
$ sudo systemctl hibernate
#让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
#启动进入救援状态(单用户状态)
$ sudo systemctl rescue
2 systemd-analyze 命令用于查看启动耗时
#查看启动耗时
$ systemd-analyze
#查看每个服务的启动耗时
$ systemd-analyze blame
#显示瀑布状的启动过程流
$ systemd-analyze critical-chain
#显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
3 hostnamectl 命令用于查看当前主机的信息
#显示当前主机的信息
$ hostnamectl
#设置主机名。
$ sudo hostnamectl set-hostname rhel7
4 localectl 命令用于查看本地化设置
#查看本地化设置
$ localectl
#设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
5 timedatectl 命令用于查看当前时区设置
#查看当前时区设置
$ timedatectl
#显示所有可用的时区
$ timedatectl list-timezones
#设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
3.6 loginctl 命令用于查看当前登录的用户
#列出当前session
$ loginctl list-sessions
#列出当前登录用户
$ loginctl list-users
#列出显示指定用户的信息
$ loginctl show-user ruanyf
13.4 Unit
1 含义
Systemd可以管理所有系统资源,不同的资源统称为 Unit(单位),Unit一共分成以下12种。
Service unit:系统服务
Target unit:多个Unit构成的一个组
Device Unit:硬件设备
Mount Unit:文件系统的挂载点
Automount Unit:自动挂载点
Path Unit:文件或路径
Scope Unit:不是由Systemd启动的外部进程
Slice Unit:进程组
Snapshot Unit:Systemd快照,可以切回某个快照
Socket Unit:进程间通信的socket
Swap Unit:swap文件
Timer Unit:定时器
systemctl list-units命令可以查看当前系统的所有Unit。
#列出正在运行的Unit
$ systemctl list-units
#列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
#列出所有没有运行的Unit
$ systemctl list-units --all --state=inactive
#列出所有加载失败的Unit
$ systemctl list-units --failed
#列出所有正在运行的、类型为service的Unit
$ systemctl list-units --type=service
2 Unit的状态
systemctl status命令用于查看系统状态和单个Unit的状态。
#显示系统状态
$ systemctl status
#显示单个Unit的状态
$ sysystemctl status bluetooth.service
实例
linux@ubuntu:~$ sudo systemctl status network-manager.service # 查看网络管理服务状态
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-08-29 09:05:32 CST; 8min ago
Docs: man:NetworkManager(8)
Main PID: 667 (NetworkManager)
Tasks: 3 (limit: 2283)
CGroup: /system.slice/NetworkManager.service
└─667 /usr/sbin/NetworkManager --no-daemon
8月 29 09:05:32 ubuntu NetworkManager[667]: <info> [1661735132.8552] device (ens33): Activation: successful, device activated.
8月 29 09:05:32 ubuntu NetworkManager[667]: <info> [1661735132.8562] devices added (path: /sys/devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33, i
8月 29 09:05:32 ubuntu NetworkManager[667]: <info> [1661735132.8562] device added (path: /sys/devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33, if
8月 29 09:05:32 ubuntu NetworkManager[667]: <info> [1661735132.8569] manager: startup complete
8月 29 09:05:33 ubuntu NetworkManager[667]: <info> [1661735133.3406] devices added (path: /sys/devices/virtual/net/lo, iface: lo)
8月 29 09:05:33 ubuntu NetworkManager[667]: <info> [1661735133.3406] device added (path: /sys/devices/virtual/net/lo, iface: lo): no ifupdown configurat
8月 29 09:05:33 ubuntu NetworkManager[667]: <info> [1661735133.4685] bluez: use BlueZ version 5
8月 29 09:05:33 ubuntu NetworkManager[667]: <info> [1661735133.4723] bluez5: NAP: added interface 18:CC:18:9F:7F:B7
8月 29 09:05:34 ubuntu NetworkManager[667]: <info> [1661735134.9764] policy: set 'netplan-ens33' (ens33) as default for IPv6 routing and DNS
8月 29 09:10:34 ubuntu NetworkManager[667]: <info> [1661735434.5635] manager: NetworkManager state is now CONNECTED_GLOBAL
linux@ubuntu:~$
除了status命令,systemctl还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。
#显示某个Unit是否正在运行
$ systemctl is-active application.service
#显示某个Unit是否处于启动失败状态
$ systemctl is-failed application.service
#显示某个Unit服务是否建立了启动链接
$ systemctl is-enabled application.service
3 Unit管理
对于用户来说,最常用的是下面这些命令,用于启动和停止Unit(主要是service)。
#立即启动一个服务
$ sudo systemctl start apache.service
#立即停止一个服务
$ sudo systemctl stop apache.service
#重启一个服务
$ sudo systemctl restart apache.service
#杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
#重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
#重载所有修改过的配置文件
$ sudo systemctl daemon-reload
#显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
#显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
#设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
4 依赖关系
Unit之间存在依赖关系:A依赖于B,就意味着Systemd在启动A的时候,同时会去启动B。
systemctl list-dependencies命令列出一个Unit的所有依赖。
$ systemctl list-dependencies nginx.service
上面命令的输出结果之中,有些依赖是Target类型(详见下文),默认不会展开显示。如果要展开Target,就需要使用–all参数。
$ systemctl list-dependencies --all nginx.service
13.4 服务管理实例 ssh 服务管理实例
1. 查看系统是否安装ssh服务
linux@ubuntu:~$ sudo apt policy ssh
ssh:
已安装:(无)
候选: 1:7.6p1-4ubuntu0.7
版本列表:
1:7.6p1-4ubuntu0.7 500
500 http://mirrors.yun-idc.com/ubuntu bionic-updates/main amd64 Packages
500 http://mirrors.yun-idc.com/ubuntu bionic-updates/main i386 Packages
1:7.6p1-4ubuntu0.5 500
500 http://mirrors.yun-idc.com/ubuntu bionic-security/main amd64 Packages
500 http://mirrors.yun-idc.com/ubuntu bionic-security/main i386 Packages
1:7.6p1-4 500
500 http://mirrors.yun-idc.com/ubuntu bionic/main amd64 Packages
500 http://mirrors.yun-idc.com/ubuntu bionic/main i386 Packages
linux@ubuntu:~$
2. 安装ssh服务
linux@ubuntu:~$ sudo apt install openssh-client openssh-server
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
openssh-client 已经是最新版 (1:7.6p1-4ubuntu0.7)。
openssh-client 已设置为手动安装。
将会同时安装下列软件:
ncurses-term openssh-sftp-server ssh-import-id
建议安装:
molly-guard monkeysphere rssh ssh-askpass
下列【新】软件包将被安装:
ncurses-term openssh-server openssh-sftp-server ssh-import-id
升级了 0 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 637 kB 的归档。
解压缩后会消耗 5,320 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.yun-idc.com/ubuntu bionic-updates/main amd64 ncurses-term all 6.1-1ubuntu1.18.04 [248 kB]
获取:2 http://mirrors.yun-idc.com/ubuntu bionic-updates/main amd64 openssh-sftp-server amd64 1:7.6p1-4ubuntu0.7 [45.5 kB]
获取:3 http://mirrors.yun-idc.com/ubuntu bionic-updates/main amd64 openssh-server amd64 1:7.6p1-4ubuntu0.7 [332 kB]
获取:4 http://mirrors.yun-idc.com/ubuntu bionic-updates/main amd64 ssh-import-id all 5.7-0ubuntu1.1 [10.9 kB]
已下载 637 kB,耗时 0秒 (1,745 kB/s)
正在预设定软件包 ...
正在选中未选择的软件包 ncurses-term。
(正在读取数据库 ... 系统当前共安装有 162789 个文件和目录。)
正准备解包 .../ncurses-term_6.1-1ubuntu1.18.04_all.deb ...
正在解包 ncurses-term (6.1-1ubuntu1.18.04) ...
正在选中未选择的软件包 openssh-sftp-server。
正准备解包 .../openssh-sftp-server_1%3a7.6p1-4ubuntu0.7_amd64.deb ...
正在解包 openssh-sftp-server (1:7.6p1-4ubuntu0.7) ...
正在选中未选择的软件包 openssh-server。
正准备解包 .../openssh-server_1%3a7.6p1-4ubuntu0.7_amd64.deb ...
正在解包 openssh-server (1:7.6p1-4ubuntu0.7) ...
正在选中未选择的软件包 ssh-import-id。
正准备解包 .../ssh-import-id_5.7-0ubuntu1.1_all.deb ...
正在解包 ssh-import-id (5.7-0ubuntu1.1) ...
正在设置 ncurses-term (6.1-1ubuntu1.18.04) ...
正在设置 openssh-sftp-server (1:7.6p1-4ubuntu0.7) ...
正在设置 ssh-import-id (5.7-0ubuntu1.1) ...
正在设置 openssh-server (1:7.6p1-4ubuntu0.7) ...
Creating config file /etc/ssh/sshd_config with new version
Creating SSH2 RSA key; this may take some time ...
2048 SHA256:jUn3b6PtMmeIM+/6wTvqQ3j3xBSKxDamhK0EchpYBvg root@ubuntu (RSA)
Creating SSH2 ECDSA key; this may take some time ...
256 SHA256:g+rxrkFtBCIwTyzY4xIPvtftDh8f04+ydYM6SFGdmBI root@ubuntu (ECDSA)
Creating SSH2 ED25519 key; this may take some time ...
256 SHA256:HhvgYDtn7L5Ay0wBbY4G/ekp608AEF1nRfOZF8VJc3g root@ubuntu (ED25519)
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...
正在处理用于 ufw (0.36-0ubuntu0.18.04.2) 的触发器 ...
正在处理用于 ureadahead (0.100.0-21) 的触发器 ...
正在处理用于 systemd (237-3ubuntu10.53) 的触发器 ...
linux@ubuntu:~$
3. 查看sshd 服务是否启动
linux@ubuntu:~$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-08-29 09:22:52 CST; 57s ago
Main PID: 2815 (sshd)
Tasks: 1 (limit: 2283)
CGroup: /system.slice/ssh.service
└─2815 /usr/sbin/sshd -D
8月 29 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
8月 29 09:22:52 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
4. 关闭服务
linux@ubuntu:~$ sudo systemctl stop sshd.service
linux@ubuntu:~$ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2022-08-29 09:25:36 CST; 3s ago
Process: 2815 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=0/SUCCESS)
Main PID: 2815 (code=exited, status=0/SUCCESS)
8月 29 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
8月 29 09:22:52 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
8月 29 09:25:36 ubuntu systemd[1]: Stopping OpenBSD Secure Shell server...
8月 29 09:25:36 ubuntu sshd[2815]: Received signal 15; terminating.
8月 29 09:25:36 ubuntu systemd[1]: Stopped OpenBSD Secure Shell server.
linux@ubuntu:~$
5. 关闭自动运行服务
linux@ubuntu:~$ sudo systemctl disable ssh.service
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable ssh
Removed /etc/systemd/system/sshd.service.
linux@ubuntu:~$
linux@ubuntu:~$ sudo systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset: enabled)
Active: inactive (dead)
8月 29 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
8月 29 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
8月 29 09:22:52 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
8月 29 09:25:36 ubuntu systemd[1]: Stopping OpenBSD Secure Shell server...
8月 29 09:25:36 ubuntu sshd[2815]: Received signal 15; terminating.
8月 29 09:25:36 ubuntu systemd[1]: Stopped OpenBSD Secure Shell server.
linux@ubuntu:~$ sudo systemctl reboot #系统重启后, 查看ssh服务是否启动
linux@ubuntu:~$ sudo systemctl status ssh.service
[sudo] linux 的密码:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; disabled; vendor preset: enabled)
Active: inactive (dead)
linux@ubuntu:~$
6. 设置开机自动运行服务
linux@ubuntu:~$ sudo systemctl enable ssh.service # 设置开机自动运行服务
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
linux@ubuntu:~$ sudo systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: inactive (dead)
linux@ubuntu:~$ sudo systemctl reboot #系统重启后, 查看ssh服务是否启动
linux@ubuntu:~$ sudo systemctl status ssh.service
[sudo] linux 的密码:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-08-29 09:36:30 CST; 31s ago
Process: 967 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Process: 961 ExecReload=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Process: 762 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 780 (sshd)
Tasks: 1 (limit: 2283)
CGroup: /system.slice/ssh.service
└─780 /usr/sbin/sshd -D
8月 29 09:36:30 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
8月 29 09:36:30 ubuntu sshd[780]: Server listening on 0.0.0.0 port 22.
8月 29 09:36:30 ubuntu sshd[780]: Server listening on :: port 22.
8月 29 09:36:30 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
8月 29 09:36:30 ubuntu systemd[1]: Reloading OpenBSD Secure Shell server.
8月 29 09:36:30 ubuntu systemd[1]: Reloaded OpenBSD Secure Shell server.
8月 29 09:36:30 ubuntu sshd[780]: Received SIGHUP; restarting.
8月 29 09:36:30 ubuntu sshd[780]: Server listening on 0.0.0.0 port 22.
8月 29 09:36:30 ubuntu sshd[780]: Server listening on :: port 22.
linux@ubuntu:~$