14 Linux系统服务管理
- 系统服务:服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。Linux 中常见的服务有那些,这些服务怎么分类,服务如何启动,服务如何自启动,服务如何查看?这都是我们需要知道的。 Linux 中服务的分类比较多,而且每种服务又有多种启动和自启动方法,所以容易混淆。同时,常见网络服务的端口号也是必须掌握的基础知识。
14.1 Linux系统服务及其分类
-
系统服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。我们把这些应用程序称作服务,也就是 Service。不过,守护进程( Daemon)":为了实现服务、功能的进程。比如,我们的 apache 服务就是服务(Service),它是用来实现 Web 服务的。那么,启动 apache 服务的进程是哪个进程呢?就是 httpd 这个守护进程(Daemon)。也就是说,**守护进程就是服务在后台运行的真实进程。**可以把服务与守护进程等同起来。在 Linux 中就是通过启动 httpd 进程来启动 apache 服务的,可以把 httpd 进程当作 apache 服务的别名来理解。
-
服务的分类:Linux 中的服务按照安装方法不同可以分为 RPM 包默认安装的服务和源码包安装的服务两大类。其中,RPM 包默认安装的服务又因为启动与自启动管理方法不同分为独立的服务和基于 xinetd 的服务。
-
Linux 中常见的软件包有两种:一种是 RPM 包;另一种是源码包。那么,通过 RPM 包安装的系统服务就是 RPM 包默认安装的服务(因为 Linux 光盘中全是 RPM 包,Linux 系统也是通过 RPM 包安装的,所以我们把 RPM 包又叫作系统默认包),通过源码包安装的系统服务就是源码包安装的服务。源码包是开源的,自定义性强,通过编译安装更加适合系统,但是安装速度较慢,编译时容易报错。RPM 包是经过编译的软件包,安装更快速,不易报错,但不再是开源的。这些特点都是软件包本身的特点
-
RPM包和源码包安装到Linux 系统中时,两者安装位置不同,源码包安装到我们手工指定的位置当中,而 RPM 包安装到系统默认位置当中(可以通过"rpm -ql 包名"命令查询)。也就是说,RPM 包安装到系统默认位置,可以被服务管理命令识别;但是源码包安装到手工指定位置,当然就不能被服务管理命令识别了(可以手工修改为被服务管理命令识别)。所以,RPM 包默认安装的服务和源码包安装的服务的管理方法不同,我们把它们当成不同的服务分类。服务分类说明如下。RPM 包默认安装的服务。这些服务是通过 RPM 包安装的,可以被服务管理命令识别。
-
这些服务又可以分为两种:
- 独立的服务:就是独立启动的意思,这种服务可以自行启动,而不用依赖其他的管理服务。因为不依赖其他的管理服务,所以,当客户端请求访问时,独立的服务响应请求更快速。目前,Linux 中的大多数服务都是独立的服务,如 apache 服务、FTP 服务、Samba 服务等。
- 基于 xinetd 的服务:这种服务就不能独立启动了,而要依靠管理服务来调用。这个负责管理的服务就是 xinetd 服务。xinetd 服务是系统的超级守护进程,其作用就是管理不能独立启动的服务。当有客户端请求时,先请求 xinetd 服务,由 xinetd 服务去唤醒相对应的服务。当客户端请求结束后,被唤醒的服务会关闭并释放资源。这样做的好处是只需要持续启动 xinetd 服务,而其他基于 xinetd 的服务只有在需要时才被启动,不会占用过多的服务器资源。但是这种服务由于在有客户端请求时才会被唤醒,所以响应时间相对较长。
-
源码包安装的服务。这些服务是通过源码包安装的,所以安装位置都是手工指定的。由于不能被系统中的服务管理命令直接识别,所以这些服务的启动与自启动方法一般都是源码包设计好的。每个源码包的启动脚本都不一样,一般需要查看说明文档才能确定。
-
查询已经安装的服务和区分服务:知道 Linux 服务的分类,那如何区分这些服务。首先要区分 RPM 包默认安装的服务和源码包安装的服务。源码包安装的服务是不能被服务管理命令直接找到的,而且一般会安装到 /usr/local/ 目录中。也就是说,在 /usr/local/ 目录中的服务都应该是通过源码包安装的服务。RPM 包默认安装的服务都会安装到系统默认位置,所以是可以被服务管理命令(如 service、chkconfig)识别的。其次,在 RPM 包默认安装的服务中怎么区分独立的服务和基于 xinetd 的服务?这就要依靠 chkconfig 命令了。chkconfig 是管理 RPM 包默认安装的服务的自启动的命令,这里仅利用这条命令的查看功能。使用这条命令还能看到 RPM 包默认安装的所有服务。命令格式如下:
[root@localhost ~]# chkconfig --list [服务名]
- 选项:
- –list:列出 RPM 包默认安装的所有服务的自启动状态;
[root@CncLucZK ~]# 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]'.
bt 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- 这条命令的第一列为服务的名称,后面的 0~6 代表在不同的运行级别中这个服务是否开启时自动启动。这些服务都是独立的服务,因为它们不需要依赖其他任何服务就可以在相应的运行级别启动或自启动。但是没有看到基于 xinetd 的服务,那是因为系统中默认没有安装 xinetd 这个超级守护进程,需要我们手工安装。安装命令如下:
[root@CncLucZK ~]# rpm -q xinetd
package xinetd is not installed
[root@CncLucZK ~]# yum -y install xinetd
...
Installed:
xinetd-2:2.3.15-24.el8.x86_64
Complete!
#xinetd超级守护进程
注意,在 Linux 中基于 xinetd 的服务越来越少,原先很多基于 xinetd 的服务在新版本的 Linux 中已经变成了独立的服务。安装完 xinetd 超级守护进程之后,我们再查看一下,命令如下:
[root@CncLucZK ~]# 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]'.
bt 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xinetd based services:
chargen-dgram: off
chargen-stream: off
daytime-dgram: off
daytime-stream: off
discard-dgram: off
discard-stream: off
echo-dgram: off
echo-stream: off
tcpmux-server: off
time-dgram: off
time-stream: off
- 在刚刚的独立的服务之下出现了一些基于 xinetd 的服务,这些服务没有自己的运行级别,因为它们不是独立的服务,到底在哪个运行级别可以自启动,则要看 xinetd 服务是在哪个运行级别自启动的。
14.2 linux端口及查询方法
-
服务是给系统提供功能的,在系统中除了有系统服务,还有网络服务。而每个网络服务都有自己的端口,一般端口号都是固定的。IP 地址是计算机在互联网上的地址编号,每台联网的计算机都必须有自己的 IP 地址,而且必须是唯一的,这样才能正常通信。也就是说,在互联网上是通过 IP 地址来确定不同计算机的位置的。知道了一台服务器的 IP 地址,我们就可以找到这台服务器。但是这台服务器上有可能搭建了多个网络服务,比如 WWW 服务、FTP 服务、Mail 服务,那么我们到底需要服务器为我们提供哪个网络服务呢?这时就要靠端口(Port)来区分了,因为每个网络服务对应的端口都是固定的。WWW 服务对应的端口是 80,FTP 服务对应的端口是 20 和 21,Mail 服务对应的端口是 25 和 110。
-
为了统一整个互联网的端口和网络服务的对应关系,以便让所有的主机都能使用相同的机制来请求或提供服务,同一个服务使用相同的端口,这就是协议。
-
计算机中的协议主要分为两大类:
- 面向连接的可靠的TCP协议(Transmission Control Protocol,传输控制协议);
- 面向无连接的不可靠的UDP协议(User Datagram Protocol,用户数据报协议);
-
这两种协议都支持 216,也就是 65535 个端口。这么多端口怎么记忆呢?系统给我们提供了服务与端口的对应文件 /etc/services。 查看—下:
[root@CncLucZK ~]# cat /etc/services
....
ftp-data 20/tcp
ftp-data 20/udp
# 21 is registered to ftp, but also used by fsp
ftp 21/tcp
ftp 21/udp fsp fspd
# http://www.iana.org/assignments/port-numbers
http 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Pro
# 24 - private mail system
smtp 25/tcp mail
smtp 25/udp mail
# unfortunately the poppassd (Eudora) uses a port which has already
# been assigned to a different service. We list the poppassd as an
#3com-tsmux 106/tcp poppassd
#3com-tsmux 106/udp poppassd
pop2 109/tcp pop-2 postoffice # POP version 2
pop2 109/udp pop-2
pop3 110/tcp pop-3 # POP version 3
pop3 110/udp pop-3
...
网络服务的端口也能够修改,不过一旦修改了端口,那么客户机在访问服务器时很难知道服务器对应的端口是什么,也就不能正确地获取服务了。所以,除非在实验环境下,否则不要修改网络服务对应的端口。
- 查询系统中已经启动的服务:每个网络服务对应的端口是固定的,可以通过查询服务器中开启的端口,来判断当前服务器开启了哪些服务,虽然判断服务器中开启的服务还有其他方法(如通过ps命令),但是通过端口的方法查看最为准确。命令格式如下:
[root@localhost ~]# netstat 选项
- 选项:
- -a:列出系统中所有网络连接,包括已经连接的网络服务、监听的网络服务和 Socket 套接字;
- -t:列出 TCP 数据;
- -u:列出 UDF 数据;
- -l:列出正在监听的网络服务(不包含已经连接的网络服务);
- -n:用端口号来显示而不用服务名;
- -p:列出该服务的进程 ID (PID);
[root@CncLucZK ~]# netstat -tulnp
#列出系统中所有已经启动的服务(已经监听的端口),但不包含已经连接的网络服务
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1337/sshd
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 920/python3
tcp6 0 0 :::33060 :::* LISTEN 1364/mysqld
tcp6 0 0 :::3306 :::* LISTEN 1364/mysqld
tcp6 0 0 :::80 :::* LISTEN 1314292/httpd
udp 0 0 172.17.0.3:68 0.0.0.0:* 1174/NetworkManager
udp 0 0 127.0.0.1:323 0.0.0.0:* 798/chronyd
udp6 0 0 ::1:323 :::* 798/chronyd
执行这条命令会看到服务器上所有已经开启的端口,也就是说,通过这些端口就可以知道当前服务器上开启了哪些服务。
- 解释一下命令的执行结果:
- Proto:数据包的协议。分为 TCP 和 UDP 数据包;
- Recv-Q:表示收到的数据已经在本地接收缓冲,但是还没有被进程取走的数据包数量;
- Send-Q:对方没有收到的数据包数量;或者没有 Ack 回复的,还在本地缓冲区的数据包数量;
- Local Address:本地 IP : 端口。通过端口可以知道本机开启了哪些服务;
- Foreign Address:远程主机:端口。也就是远程是哪个 IP、使用哪个端口连接到本机。由于这条命令只能查看监听端口,所以没有 IP 连接到到本机;
- State:连接状态。主要有已经建立连接(ESTABLISED)和监听(LISTEN)两种状态,当前只能查看监听状态;
- PID/Program name:进程 ID 和进程命令;
[root@CncLucZK ~]# netstat -anp
#查看所有的网络连接,包括已连接的网络服务、监听的网络服务和Socket套接字
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1337/sshd
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 920/python3
tcp 0 0 172.17.0.3:8888 107.172.214.60:47757 ESTABLISHED 920/python3
tcp 0 232 172.17.0.3:22 110.19.110.72:8384 ESTABLISHED 2101519/sshd: root
tcp 0 0 172.17.0.3:8888 192.99.5.174:47618 ESTABLISHED 920/python3
tcp 0 0 172.17.0.3:41522 169.254.0.55:8080 TIME_WAIT -
tcp 0 0 172.17.0.3:40764 169.254.0.55:5574 ESTABLISHED 2064/YDService
tcp6 0 0 :::33060 :::* LISTEN 1364/mysqld
tcp6 0 0 :::3306 :::* LISTEN 1364/mysqld
tcp6 0 0 :::80 :::* LISTEN 1314292/httpd
udp 0 0 172.17.0.3:68 0.0.0.0:* 1174/NetworkManager
udp 0 0 127.0.0.1:323 0.0.0.0:* 798/chronyd
udp6 0 0 ::1:323 :::* 798/chronyd
#Socket套接字输出
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] SEQPACKET LISTENING 15363 1/systemd /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 17440 1/systemd /var/run/.heim_org.h5l.kcm-socket
unix 2 [ ACC ] STREAM LISTENING 17445 1/systemd /run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 7119164 1314293/httpd /etc/httpd/run/cgisock.1314292
unix 2 [ ACC ] STREAM LISTENING 17444 1/systemd @ISCSID_UIP_ABSTRACT_NAMESPACE
unix 2 [ ] DGRAM 17760 798/chronyd /var/run/chrony/chronyd.sock
unix 2 [ ] DGRAM 11519341 2101530/systemd /run/user/0/systemd/notify
unix 2 [ ACC ] STREAM LISTENING 11519345 2101530/systemd /run/user/0/systemd/private
unix 2 [ ACC ] STREAM LISTENING 11519351 2101530/systemd /run/user/0/bus
unix 2 [ ACC ] STREAM LISTENING 26709 1364/mysqld /var/lib/mysql/mysqlx.sock
...
Active Bluetooth connections (servers and established)
Proto Destination Source State PSM DCID SCID IMTU OMTU Security
Proto Destination Source State Channel
- 执行"netstat -an"命令能査看更多的信息,在 Stated 中也看到了已经建立的连接(ESTABLISED)。这是 ssh 远程管理命令产生的连接,ssh 对应的端口是 22。还看到了 Socket 套接字。在服务器上,除网络服务可以绑定端口,用端口来接收客户端的请求数据外,系统中的网络程序或我们自己开发的网络程序也可以绑定端口,用端口来接收客户端的请求数据。这些网络程序就是通过 Socket 套接字来绑定端口的。也就是说,网络服务或网络程序要想在网络中传递数据,必须利用 Socke 套接字绑定端口,并进行数据传递。
使用"netstat -an"命令查看到的这些 Socke 套接字虽然不是网络服务,但是同样会占用端口,并在网络中传递数据。
- Socket 套接字的输出各字段值:
- Proto:协议,一般是unix;
- RefCnt:连接到此Socket的进程数量;
- Flags:连接标识;
- Type:Socket访问类型;
- State:状态,LISTENING表示监听,CONNECTED表示已经建立连接;
- I-Node:程序文件的 i 节点号;
- Path:Socket 程序的路径,或者相关数据的输出路径;
参考文献:
Linux系统服务及其分类