第13章 Linux的系统服务管理

腾讯课堂视频链接

文档配套视频讲解链接地址

  1. 腾讯课堂视频链接地址 : 51_Shell编程_Shell变量1
  2. 腾讯课堂视频链接地址 : 52_Shell编程_read与test命令2
  3. 腾讯课堂视频链接地址 : 53_Shell编程_小节复习3
  4. 腾讯课堂视频链接地址 : 54_Shell编程_控制语句4
  5. 腾讯课堂视频链接地址 : 55_Shell编程_小节复习-行业热点教程5
  6. 腾讯课堂视频链接地址 : 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

​ (上图为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入门教程:命令篇Systemd入门教程:命令篇

​ (上图为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

829 09:05:32 ubuntu NetworkManager[667]: <info>  [1661735132.8552] device (ens33): Activation: successful, device activated.
829 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
829 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
829 09:05:32 ubuntu NetworkManager[667]: <info>  [1661735132.8569] manager: startup complete
829 09:05:33 ubuntu NetworkManager[667]: <info>  [1661735133.3406] devices added (path: /sys/devices/virtual/net/lo, iface: lo)
829 09:05:33 ubuntu NetworkManager[667]: <info>  [1661735133.3406] device added (path: /sys/devices/virtual/net/lo, iface: lo): no ifupdown configurat
829 09:05:33 ubuntu NetworkManager[667]: <info>  [1661735133.4685] bluez: use BlueZ version 5
829 09:05:33 ubuntu NetworkManager[667]: <info>  [1661735133.4723] bluez5: NAP: added interface 18:CC:18:9F:7F:B7
829 09:05:34 ubuntu NetworkManager[667]: <info>  [1661735134.9764] policy: set 'netplan-ens33' (ens33) as default for IPv6 routing and DNS
829 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

829 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
829 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
829 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
829 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)

829 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
829 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
829 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
829 09:22:52 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
829 09:25:36 ubuntu systemd[1]: Stopping OpenBSD Secure Shell server...
829 09:25:36 ubuntu sshd[2815]: Received signal 15; terminating.
829 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)

829 09:22:52 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
829 09:22:52 ubuntu sshd[2815]: Server listening on 0.0.0.0 port 22.
829 09:22:52 ubuntu sshd[2815]: Server listening on :: port 22.
829 09:22:52 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
829 09:25:36 ubuntu systemd[1]: Stopping OpenBSD Secure Shell server...
829 09:25:36 ubuntu sshd[2815]: Received signal 15; terminating.
829 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

829 09:36:30 ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
829 09:36:30 ubuntu sshd[780]: Server listening on 0.0.0.0 port 22.
829 09:36:30 ubuntu sshd[780]: Server listening on :: port 22.
829 09:36:30 ubuntu systemd[1]: Started OpenBSD Secure Shell server.
829 09:36:30 ubuntu systemd[1]: Reloading OpenBSD Secure Shell server.
829 09:36:30 ubuntu systemd[1]: Reloaded OpenBSD Secure Shell server.
829 09:36:30 ubuntu sshd[780]: Received SIGHUP; restarting.
829 09:36:30 ubuntu sshd[780]: Server listening on 0.0.0.0 port 22.
829 09:36:30 ubuntu sshd[780]: Server listening on :: port 22.
linux@ubuntu:~$ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值