文章目录
- 通过systemctl管理服务
- 通过systemctl管理单一服务(service unit)
- 使用案例
- 服务启动/关闭/查看的练习
- 关于systemctl命令启动/停止服务后面的后缀名是否加?
- 通过systemctl查看系统上所有的服务
- 使用案例
- 通过systemctl管理不同的操作环境(target unit)
- 使用案例
- 通过systemctl分析各服务之间的依赖性
- 使用案例
- 与systemd的daemon运行过程相关的目录简介
- 网络服务与端口对应简介
- 关闭网络服务
通过systemctl管理服务
基本上,systemd这个启动服务的机制,主要是通过一个名为systemctl的命令来完成的。跟以前System V 需要service、chkconfig、setup、init等命令来协助不同,systemd只有systemctl这个命令来处理而已,全部的操作都得要systemctl。
通过systemctl管理单一服务(service unit)
一般来说服务的启动有两个阶段,一个是【开机的时候设置要不要启动这个服务】,以及【你现在要不要启动这个服务】,这两者之间有很大的差异。举个例子,假如我们现在要【立刻停止atd这个服务】时,正确的的方法(不能使用kill)要怎么处理?
systemctl [command] [unit]
command主要有:
start:立刻启动后面接的unit
stop:里关闭后面接的unit
restart:立刻重启后面接的unit,就是执行stop再start的意思
reload:不关闭后面接的unit的情况下,重新加载配置文件,让设置生效
enable:设置下次开机时,后面接的unit会被启动
disable:设置下次开机时,后面接的unit不会被启动
status:目前后面接的这个unit的状态,会里出有没有正在执行、开机默认执行与否、登录等信息等
is-aotive:目前有没有正在运行
is-enable:开机时有没有默认启用这个unit
使用案例
案例一:看看目前atd这个服务的状态是什么(前提是你得有at这个服务)
-
重点在于第二、第三行
-
Loaded:这行说明、开机的时候这个unit会不会启动,enabled为开机启动,disabled开机不会启动
-
Active:现在这个unit的状态是正在执行(running)或没有执行(dead)
-
后面几行则是说明这个unit程序的PID状态以及最后一行显示这个服务的日志文件信息
-
日志文件信息格式为:【时间】 【信息发送主机】【哪一个服务的信息】【实际信息内容】
所以上面的显示信息是:这个atd默认开机就启动,而且现在正在运行的意思。
案例二:正常关闭这个atd服务
目前这个unit下次开机还是会启动,但是现在处于关闭状态,同时,最后两行为新增加的登录信息,告诉我们目前系统状态
上面案例中,我们已经关闭了ard,这样做才是对的。不应该使用kill的方式来关闭一个正常的服务。否则systemctl会无法继续监控该服务,那就比较麻烦了。虽然atd现在是关闭的,未来重新启动后,这个服务也会再次启动,因为他是enabled,【现在的状态】和【开机的默认状态】两者是有差异的
Active除了running和dead之外还有其他状态
- active(running):正有一个或多个进程正在系统中运行的意思,举例来说,正在运行中的atd就是这种模式
- active(exited):仅执行一次就正常结束的服务,目前并没有任何进程再系统中执行。
- active(waiting):正在运行当中,不过还需要等待其他的事件发生才能继续运行。
- inactive:这个服务目前没有运行
- enabled:这个daemon将在开机时被运行
- disabled:这个daemon在开机时不会被运行
- static:这个daemon不可以自己启动(不可enable),不过可能会被其他的enabled的服务来唤醒(依赖属性的服务)
- mask:这个daemon无论如何都无法被启动,因为已经被强制注销(非删除)。可通过systemctl unmask方式改为默认状态。
服务启动/关闭/查看的练习
找到系统中名为chronyd的服务,查看此服务的状态,查看完毕后,将此服务设置为:(1)开机不会启动(2)现在状况是关闭的
- 查看状态,确认是否为关闭/未启动
[root@localhost ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since 四 2023-05-11 08:46:23 CST; 8h ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 804 (chronyd)
CGroup: /system.slice/chronyd.service
└─804 /usr/sbin/chronyd
5月 11 08:46:23 localhost.localdomain systemd[1]: Starting NTP client/server...
5月 11 08:46:23 localhost.localdomain chronyd[804]: chronyd version 3.4 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SC...EBUG)
5月 11 08:46:23 localhost.localdomain chronyd[804]: Frequency -33.147 +/- 0.259 ppm read from /var/lib/chrony/drift
5月 11 08:46:23 localhost.localdomain systemd[1]: Started NTP client/server.
5月 11 08:46:33 localhost.localdomain chronyd[804]: Selected source 162.159.200.1
5月 11 08:46:33 localhost.localdomain chronyd[804]: System clock wrong by -3.831645 seconds, adjustment started
5月 11 08:46:29 localhost.localdomain chronyd[804]: System clock was stepped by -3.831645 seconds
5月 11 08:46:33 localhost.localdomain chronyd[804]: Source 193.182.111.14 replaced with 193.182.111.142
5月 11 09:08:10 localhost.localdomain chronyd[804]: Selected source 84.16.67.12
Hint: Some lines were ellipsized, use -l to show in full.
- 由上面知道目前是启动的,因此立刻将他关闭,同时开机不会启动才行
[root@localhost ~]# systemctl stop chronyd.service
[root@localhost ~]# systemctl disable chronyd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/chronyd.service.
# 其实就是从/etc/systemd/system 下面移除了一条链接文件而已
[root@localhost ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled)
Active: inactive (dead)
Docs: man:chronyd(8)
man:chrony.conf(5)
# 如此则将chronyd这个服务完整的关闭了
关于systemctl命令启动/停止服务后面的后缀名是否加?
在使用systemctl命令停止服务时,systemctl stop atd.service和systemctl stop atd这两条命令是等价的,都会停止atd服务。因为systemctl命令会自动识别服务类型,如果服务名能够唯一匹配到一个服务单元,就可以省略服务单元名的后缀。
不过,建议在使用systemctl命令时,尽量使用完整的服务单元名来指定服务,这样可以避免服务名和其他单元名发生冲突或者产生歧义
。同时,完整的服务单元名也更加明确和易于理解,便于其他管理员或者开发人员进行服务管理和维护。
因此,建议使用下面的命令来停止atd服务:
systemctl stop atd.service
这样可以确保服务单元名的唯一性和明确性,避免发生不必要的错误或者冲突。
通过systemctl查看系统上所有的服务
上面谈到的是单一服务的启动、关闭、查看,以及依赖服务要注销的功能。那系统上面有多少的服务存在?这时候就得要通过list-units及list-unit-files来查看。语法如下
systemctl [command] [--type=TYPE] [--all]
command:
list-units :依据unit显示目前有启动的unit,若加上-all才会列出没启动的。
list-units-files:依据/usr/lib/systemd/system/ 内的文件,将所有文件列表说明。
--type=TYPE:就是之前提到的unit类型,主要有service、socket、target等
使用案例
列出系统上面有启动的unit
[root@localhost ~]# systemctl list-units
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automoun
sys-devices-pci0000:00-0000:00:07.1-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged VMware_Virtual_IDE_CDROM
sys-devices-pci0000:00-0000:00:10.0-host2-target2:0:0-2:0:0:0-block-sda-sda1.device loaded active plugged VMware_Virtual_S 1
sys-devices-pci0000:00-0000:00:10.0-host2-target2:0:0-2:0:0:0-block-sda-sda2.device loaded active plugged VMware_Virtual_S 2
sys-devices-pci0000:00-0000:00:10.0-host2-target2:0:0-2:0:0:0-block-sda.device loaded active plugged VMware_Virtual_S
....
......
vsftpd.service loaded active running Vsftpd ftp daemon
.....
...
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
113 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
# 列出的项目中,主要的意义是:
# UNIT :项目的名称,包括各unit的类别(看副文件名)
# LOAD :开机时是否会被加载,默认systemctl显示的是加载的项目而已
# ACTIVE :目前的状态,须与后续的SUB搭配,就是我们用systemctl status 查看时,active的项目
# DESCRIPTION:详细描述
# 另外systemctl 不加删除,默认就是 list-units的意思
列出所有已经安装的unit有哪些
使用【systemctl list-unit-files】会将系统上所有的服务通通显示出来,而不像list-units仅以unit分类作大致的说明。至于STATE状态就是开机是否会加载的那个状态项目。主要有enabled、disabled、mask、static等。
假设我不想要知道这么多的unit项目,我只想知道service这种类别的daemon而已,而且不论是否已经成功,通通要显示出来。
只有*.service的项目才会出现
通过systemctl管理不同的操作环境(target unit)
上个小节我们知道系统上所有的systemd的unit查看的方式,那么可否列出跟操作界面有关的target项目呢?
[root@localhost ~]# systemctl list-units --type=target --all
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Local Encrypted Volumes
emergency.target loaded inactive dead Emergency Mode
final.target loaded inactive dead Final Step
getty-pre.target loaded inactive dead Login Prompts (Pre)
getty.target loaded active active Login Prompts
graphical.target loaded inactive dead Graphical Interface
initrd-fs.target loaded inactive dead Initrd File Systems
initrd-root-fs.target loaded inactive dead Initrd Root File System
initrd-switch-root.target loaded inactive dead Switch Root
initrd.target loaded inactive dead Initrd Default Target
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
network-online.target loaded active active Network is Online
network-pre.target loaded active active Network (Pre)
network.target loaded active active Network
nss-user-lookup.target loaded inactive dead User and Group Name Lookups
paths.target loaded active active Paths
remote-fs-pre.target loaded inactive dead Remote File Systems (Pre)
remote-fs.target loaded active active Remote File Systems
rescue.target loaded inactive dead Rescue Mode
shutdown.target loaded inactive dead Shutdown
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
● syslog.target not-found inactive dead syslog.target
time-sync.target loaded inactive dead System Time Synchronized
timers.target loaded active active Timers
umount.target loaded inactive dead Unmount All Filesystems
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
33 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
在centos7.9.2009中,默认情况下有26个target unit,而跟操作界面相关性比较高的target主要有下面几个。
graphical.target
:就是命令加上图形界面,这个项目已经包含了下面的multi-user.targetmulti-user.target
:纯命令行模式rescue.target
:在无法使用root登录的情况下,systemd在启动时会多加一个额外的临时系统,与你原本的系统无关,这时你可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要用到chroot的方式来取得你原有的系统emergency.target
:紧急处理系统的错误,还是需要使用root登录的情况,在无法使用rescue.target时,可以尝试使用这种模式。shutdown.target
:就是关机的模式getty.target
:可以设置你需要几个tty之类的操作,如果你想要降低tty的数量,可以修改它的配置文件
正常的模式是 multi-user.target 以及 graphical.target 两个,恢复方面的模式主要是rescue.target 以及更紧急的emergency.target。如果要修改可提供登录的tty数量,则修改getty.target即可。基本上,我们最常使用的当然就是multi-user 以及graphical。
那么我如何知道目前的模式是哪一种呢?如何修改呢?
systemctl [command] [unit.target]
选项:
command:
get-default:取得目前的target
set-default:设置后面接的target称为默认的操作模式
isolate:切换到后面接的模式
使用案例
我们测试机器默认是图形界面、先查看是否为图形模式,再将模式模式转为命令行模式或图形界面。
[root@localhost ~]# systemctl get-default
multi-user.target # 命令行界面
[root@localhost ~]# systemctl set-default graphical.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
[root@localhost ~]# systemctl get-default
graphical.target
在不重新启动的情况下,将目前的操作环境改为纯命令行模式,关闭图形界面
[root@localhost ~]# systemctl isolate multi-user.target
若需要重新取得图形界面
[root@localhost ~]# systemctl isolate graphical.target
需要注意的是,改变graphical.target 以及 multi-user.target 是通过isolate来完成的。
在正常的切换情况下,使用上述isolate的方式即可。不过未来方便起见,systemd 也提供了数个简单的命令给我们切换操作模式
systemctl poweroff 系统关机
systemctl reboot 重新开机
systemctl suspend 进入挂起模式
systemctl hibernate 进入休眠模式
systemctl rescue 强制进入恢复模式
systemctl emergency 强制进入紧急恢复模式
我们来一一解释一下上面的操作
systemctl poweroff
:该命令用于关闭系统,类似于传统的shutdown -h now命令。systemctl reboot
:该命令用于重新启动系统,类似于传统的shutdown -r now命令。systemctl suspend
:该命令用于将系统挂起(睡眠模式),可以快速恢复系统状态,但是会消耗一定的电量。systemctl hibernate
:该命令用于将系统休眠(休眠模式),可以保存当前系统状态到硬盘中,以便下次唤醒时恢复。systemctl rescue
:该命令用于强制进入恢复模式,该模式下只会启动最小限度的系统服务,可以用于修复系统问题,如丢失了root密码等。systemctl emergency
:该命令用于强制进入紧急恢复模式,该模式下只会启动最小限度的系统服务,并且所有本地文件系统都会以只读方式挂载,可以用于修复严重的系统问题,如磁盘损坏等。
通过systemctl分析各服务之间的依赖性
如何追踪某一个unit的依赖性呢?举例来说,我们怎么知道graphical.target 会用到 multi-user.target?那graphical.target 下面还有哪些东西?
systemctl list-dependencies [unit] [--reverse]
选项:
--reverse:反向追踪谁使用这个unit的意思。
使用案例
列出目前的target环境下,用到了哪些unit
[root@localhost ~]# systemctl get-default
graphical.target
[root@localhost ~]# systemctl list-dependencies
default.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─atd.service
● ├─auditd.service
● ├─crond.service
● ├─dbus.service
● ├─irqbalance.service
● ├─kdump.service
● ├─network.service
● ├─NetworkManager.service
● ├─plymouth-quit-wait.service
● ├─plymouth-quit.service
● ├─postfix.service
● ├─rhel-configure.service
● ├─rsyslog.service
● ├─sshd.service
● ├─systemd-ask-password-wall.path
● ├─systemd-logind.service
● ├─systemd-update-utmp-runlevel.service
● ├─systemd-user-sessions.service
● ├─tuned.service
● ├─vmtoolsd.service
● ├─vsftpd.service
● ├─basic.target
● │ ├─microcode.service
● │ ├─rhel-dmesg.service
● │ ├─selinux-policy-migrate-local-changes@targeted.service
● │ ├─paths.target
● │ ├─slices.target
● │ │ ├─-.slice
● │ │ └─system.slice
● │ ├─sockets.target
● │ │ ├─dbus.socket
● │ │ ├─dm-event.socket
● │ │ ├─systemd-initctl.socket
● │ │ ├─systemd-journald.socket
● │ │ ├─systemd-shutdownd.socket
● │ │ ├─systemd-udevd-control.socket
● │ │ └─systemd-udevd-kernel.socket
● │ ├─sysinit.target
● │ │ ├─dev-hugepages.mount
● │ │ ├─dev-mqueue.mount
● │ │ ├─kmod-static-nodes.service
● │ │ ├─lvm2-lvmetad.socket
● │ │ ├─lvm2-lvmpolld.socket
● │ │ ├─lvm2-monitor.service
● │ │ ├─plymouth-read-write.service
● │ │ ├─plymouth-start.service
● │ │ ├─proc-sys-fs-binfmt_misc.automount
● │ │ ├─rhel-autorelabel-mark.service
● │ │ ├─rhel-autorelabel.service
● │ │ ├─rhel-domainname.service
● │ │ ├─rhel-import-state.service
● │ │ ├─rhel-loadmodules.service
● │ │ ├─sys-fs-fuse-connections.mount
● │ │ ├─sys-kernel-config.mount
● │ │ ├─sys-kernel-debug.mount
● │ │ ├─systemd-ask-password-console.path
● │ │ ├─systemd-binfmt.service
● │ │ ├─systemd-firstboot.service
● │ │ ├─systemd-hwdb-update.service
● │ │ ├─systemd-journal-catalog-update.service
● │ │ ├─systemd-journal-flush.service
● │ │ ├─systemd-journald.service
● │ │ ├─systemd-machine-id-commit.service
● │ │ ├─systemd-modules-load.service
● │ │ ├─systemd-random-seed.service
● │ │ ├─systemd-sysctl.service
● │ │ ├─systemd-tmpfiles-setup-dev.service
● │ │ ├─systemd-tmpfiles-setup.service
● │ │ ├─systemd-udev-trigger.service
● │ │ ├─systemd-udevd.service
● │ │ ├─systemd-update-done.service
● │ │ ├─systemd-update-utmp.service
● │ │ ├─systemd-vconsole-setup.service
● │ │ ├─cryptsetup.target
● │ │ ├─local-fs.target
● │ │ │ ├─-.mount
● │ │ │ ├─boot.mount
● │ │ │ ├─home.mount
● │ │ │ ├─rhel-readonly.service
● │ │ │ └─systemd-remount-fs.service
● │ │ └─swap.target
● │ │ └─dev-mapper-centos\x2dswap.swap
● │ └─timers.target
● │ └─systemd-tmpfiles-clean.timer
● ├─getty.target
● │ └─getty@tty1.service
● └─remote-fs.target
因为我们把操作模式变成了 multi-user.target ,因此这边使用list-dependencies时,所列出的default.target其实是multi-user.target的内容。根据线条连接结构,我们也能够知道,multi-user.target 其实还会用到 basic.target、getty.target、remote-fs.target 三大项目,而basic.target 又用到了 sockets.target、sysint.target、timers.target等,依赖关系显示的很清楚。
如果查出谁会用到multi-user.target?
[root@localhost ~]# systemctl list-dependencies --reverse
default.target
reverse,本来就是反向的意思,所以加上这个选项,代表【谁还会用到我的服务】的意思,所以 multi-user.target主要是被default.target所使用
那么default-target又使用了多少服务呢?
[root@localhost ~]# systemctl list-dependencies default.target
default.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
● ├─atd.service
● ├─auditd.service
● ├─crond.service
● ├─dbus.service
● ├─irqbalance.service
● ├─kdump.service
● ├─network.service
● ├─NetworkManager.service
● ├─plymouth-quit-wait.service
● ├─plymouth-quit.service
● ├─postfix.service
● ├─rhel-configure.service
与systemd的daemon运行过程相关的目录简介
-
/usr/lib/systemd/system/
:使用CentOS官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改,要修改时,请到/etc/systemd/system下面修改较好。 -
/run/systemd/system/
:系统执行过程中所产生的服务脚本,这些脚本的优先级要比/usr/lib/systemd/system 高 -
/etc/systemd/system/
:管理员依据主机系统的需求所建立的执行脚本,其实这里目录有点像以前的/etc/rc.d/rc5.d/Sxx 之类的功能,执行优先级又比/run/systemd/system/ 高 -
/etc/sysconfig/*
:该目录存放系统服务的配置文件。这些配置文件包含了服务启动时的参数和环境变量等信息。例如,/etc/sysconfig/iptables
文件包含了iptables防火墙的配置信息。如果服务单元文件中指定了某个配置文件路径,则该路径的配置文件会覆盖该目录中的同名配置文件。 -
/var/lib/
:该目录存放系统和服务的运行时数据,如数据库、缓存、日志等。例如,/var/lib/mysql
目录存放了MySQL数据库的数据文件。在服务启动时,服务进程会使用该目录中存储的数据。 -
/run/
:该目录存放运行时文件,如进程ID文件、锁文件等。例如,/run/httpd/httpd.pid
文件存放了Apache HTTP服务器进程的PID。这些文件通常在系统启动时自动创建,系统关闭时自动删除。如果该目录中的文件不可用或损坏,服务可能无法正常启动。
需要注意的是,上述目录和文件的优先级关系是有限制的,例如,某些服务单元文件中可能会指定某个配置文件的路径,此时该配置文件的路径就是服务单元文件中指定的路径,而不是根据优先级关系找到的路径。
我们知道systemd里面有很多的本机会用到socket服务,里面可能会产生很多的socket文件,那你怎么知道socket文件放置在哪?
[root@localhost ~]# systemctl list-sockets
LISTEN UNIT ACTIVATES
/dev/log systemd-journald.socket systemd-journald.service
/run/dbus/system_bus_socket dbus.socket dbus.service
/run/dmeventd-client dm-event.socket dm-event.service
/run/dmeventd-server dm-event.socket dm-event.service
/run/lvm/lvmetad.socket lvm2-lvmetad.socket lvm2-lvmetad.service
/run/lvm/lvmpolld.socket lvm2-lvmpolld.socket lvm2-lvmpolld.service
/run/systemd/initctl/fifo systemd-initctl.socket systemd-initctl.service
/run/systemd/journal/socket systemd-journald.socket systemd-journald.service
/run/systemd/journal/stdout systemd-journald.socket systemd-journald.service
/run/systemd/shutdownd systemd-shutdownd.socket systemd-shutdownd.service
/run/udev/control systemd-udevd-control.socket systemd-udevd.service
kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
12 sockets listed.
Pass --all to see loaded but inactive sockets, too.
这样很清楚就能够知道正在监听本地服务需求的socket文件所在的位置
网络服务与端口对应简介
网络服务与端口是一一对应的,每个网络服务都需要使用一个端口来进行通信。以下是常见网络服务及其对应的端口:
-
FTP(文件传输协议):20(数据端口)、21(控制端口)
-
SSH(安全外壳协议):22
-
Telnet(远程终端协议):23
-
SMTP(简单邮件传输协议):25
-
DNS(域名系统):53
-
HTTP(超文本传输协议):80
-
POP3(邮局协议版本3):110
-
HTTPS(安全超文本传输协议):443
-
RDP(远程桌面协议):3389
当网络服务需要进行通信时,它会使用相应的端口进行数据的传输和接收。这样的设计可以让不同的网络服务在同一台计算机上并存,同时也可以让不同的计算机上的网络服务进行通信。
也可以查询/etc/service来查询服务的端口
less /etc/service
# 文件内容较多建议使用less
这个文件的内容是以下面的格式来显示的
< dademon name > < port/封包协议 > < 该服务的说明 >
关闭网络服务
什么是网络服务,基本上产生一个网络监听端口(port)的进程,他就可以称为网络服务,那么如何查看网络端口?
# 默认没有netstat命令需要手动安装net-tools
[root@localhost ~]# netstat -tlunp
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 1080/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1311/master
tcp6 0 0 :::21 :::* LISTEN 1087/vsftpd
tcp6 0 0 :::22 :::* LISTEN 1080/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1311/master
那么如果我要关闭vsftpd服务
[root@localhost ~]# systemctl stop vsftpd.service
[root@localhost ~]# netstat -tlunp
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 1080/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1311/master
tcp6 0 0 :::22 :::* LISTEN 1080/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1311/master
上面的案例只是举例,关闭了vsftpd然后再打开。如果你系统里面有一堆网络端口在监听,而你压根不知道是干什么用的,就建议你停止该服务。