1. 什么是进程
在此之前需要先了解下什么叫程序,我们这类人通常以
程序猿
自嘲,那什么是程序呢?其实
程序(program):也通常翻译成binary program,就是程序猿/媛写好存储在硬盘、光盘、软盘、磁带、U盘等存储媒介上的文件对吧
?而什么是进程呢?
进程(process):简单而言就是运行的程序;程序被触发后,会伴随着执行者的权限与属性,程序代码以及需要的数据加载到内存中形成一个单元,就叫进程,而操作系统为了好管理它会给这个单元设置一个数字标记符PID(重点),就类似你的学号。
,具体可以参看图1.1;
图1.1 程序被加载到内存中执行成为进程
同时一个进程A在运行中,可能会call起另一个程序B去干活,新生的进程B当然也会得到一个PID,这种情况B就叫A的子进程,A叫B的父进程;A的PID相对B而言就叫PPID,这就是为啥有时候命名你kill了一个进程,过了一会儿又产生了一个新的子进程;这种情况就需要直接kill父进程(允许的前提下);父子进程的关系如图1.2;注意,此图重在说明父子进程,后续指令中会用到,实际父子进程的关系是相对复杂的,有兴趣的可以参看下《操作系统》之类的书籍,此处不作累赘;
图1.2 父进程与子进程
2. Linux下进程与执行者的关系(多人多任务环境)
在Linux下,可以有许多的执行者,每个执行者又被叫做用户,每个用户都可以执行自己的程序,即有自己的进程,那这些执行者之间是不是只能等某个先执行自己的程序后另一个执行者才可以去执行自己的程序呢?显然不是的,如图2.1,Linux默认有6个独立得终端窗口,再VM虚拟机上是以
Ctrl+Alt+F1~F6
来切换的,每个独立窗口可以各自选择图形界面操作或命令行操作,可以使用不同的执行者做不同的事,从而达到多用户多任务的环境,同一个窗口内,也可以通过
su
切换用户来执行不同用户的程序,这种模式有什么优缺点呢?
-
优点
:多环境相互独立,如果某执行的某个任务卡死,可以在其他环境内利用有权限的执行者帮助其杀死即可,这样就可以继续运行了,这也是linux稳定的原因,基本上很难宕机,服务器可以保证半年,一年甚至更久才需要重启; -
缺点
:需要关注资源分配问题,人数多了,CPU,内存。磁盘吞吐,网络带宽等性能的竞争也就出来了,需要管理者合理安排,真正达到瓶颈时,也就需要机器扩容升级了。
图2.1 Linux多人多任务环境
那对大多数开发而言,平时也是无法直接登录服务器的终端的,那也可以用远程工具模拟这个多人多任务环境,如图2.2利用MobaXterm开多个session登录自己的Linux;
图2.2 Linux远程工具MobaXterm多人多任务环境
那我们熟悉的window系统有没有这种功能呢?其实也有,个人电脑可能用的少些,但是window服务器,只要你打开
任务管理器
也可以看到多用户多环境,当某一个用户卡死时,另一个用户(需要有权限)也可以尝试选中卡死的用户,看看他的是哪个进程卡死,帮助其
结束任务
即可;也可以选中用户,帮助其
注销
,这样该用户的环境会重启,整台服务器不会重启,这种情况是在解决服务器上别人不卡就你卡的情况。
博主平时工作的关系,Linux和window多人多任务环境都要使用,但是window的远没有linux稳定,极其容易所有用户宕机,导致需要整台服务器重启,所以不论在什么环境下,按时保存。备份关键文件很重要。
图2.3 windows多人多任务环境
3. 工作(Job)管理
什么叫工作,也叫作业,其实感觉怎么翻译都没有Job本身带劲,就是当你在登录到某一个终端环境下时,即启用了bash进程,在这个终端环境所做的所有事情,都是该bash的子进程,那这些子进程,通常我们也成为一个一个Job,学习Job管理的目的就是为了让你能在一个终端环境内完成一边查数据,一边copy文件,有些人可能会觉得我不是有多终端吗?为啥还要多此一举?博主觉得,切换窗口也挺烦的,再者查看哪些子进程一直挂起在后端做骷髅进程之类的操作也是很重要的呀,而且指令是无限多的,窗口终究会用完,所以学习也是很有必要的。
3.1 将指令丢到后端执行 &
&
就是将指令丢到后端去执行的意思,如下面的例子;
# 将/etc文件备份到/tmp下然后查看下tmp下有啥
[root@centos-7 tmp]# tar -zcpf /tmp/etc2.tar.gz /etc &
[1] 64445
# 上面的这个东东就是该程序在后端运行的PID
[root@centos-7 tmp]# tar: 从成员名中删除开头的“/”
# 不等上面的指令完成,直接输入ll,查看/tmp下有啥
ll
总用量 11324
-rw-r--r--. 1 root root 11118992 2月 17 20:51 etc2.tar.gz
drwx------. 2 hadoop hadoop 25 2月 8 21:26 ssh-PJvqUpJZ09z2
drwx------. 3 root root 17 2月 8 21:25 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-bolt.service-nTqlqw
drwx------. 3 root root 17 2月 8 22:14 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-chronyd.service-tut9uG
drwx------. 3 root root 17 2月 8 21:25 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-colord.service-szD6Eb
drwx------. 3 root root 17 2月 9 10:33 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-cups.service-QPmEAZ
drwx------. 3 root root 17 2月 8 21:26 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-fwupd.service-xyQHJ2
drwx------. 3 root root 17 2月 8 21:25 systemd-private-48408330daaf4c0fa75fd2f11f8ad415-rtkit-daemon.service-2Fzv9p
drwx------. 2 root root 6 5月 27 2021 tracker-extract-files.0
drwx------. 2 hadoop hadoop 6 2月 8 16:18 tracker-extract-files.1000
drwx------. 2 root root 6 2月 8 15:01 vmware-root_21876-3134878632
drwx------. 2 root root 6 2月 8 16:52 vmware-root_37856-4202935087
drwx------. 2 root root 6 2月 8 15:31 vmware-root_6079-1715412427
drwx------. 2 root root 6 2月 8 14:51 vmware-root_6084-961263569
drwx------. 2 root root 6 2月 8 15:16 vmware-root_6085-1992043535
drwx------. 2 root root 6 2月 8 15:21 vmware-root_6088-1003139162
drwx------. 2 root root 6 2月 8 15:38 vmware-root_6107-1991519254
drwx------. 2 root root 6 2月 8 22:14 vmware-root_6128-1003008124
drwx------. 2 root root 6 2月 8 15:25 vmware-root_6351-1950294787
-rw-------. 1 root root 472374 2月 8 16:19 yum_save_tx.2022-02-08.16-19.hUVQ2O.yumtx
# 下面这个东东出现表示第一条指令已经运行完成
[1]+ 完成 tar -zcpf /tmp/etc2.tar.gz /etc
但是如果指令本身有stdout(标准输出,代码是1)和stderr(标准错误输出,代码是2)时,
&
也会把这些标准输出到屏幕上的,如果你不想看,可以重定向到某个日志文件下;
[root@centos-7 tmp]# tar -zcvf /tmp/etc2.tar.gz /etc >/tmp/log.txt 2>&1 &
[1] 86416
# 将标准错误输出和标准输出一起追加到文件/tmp/log.txt,同时该指令在后台运行
3.2 将目前的工作暂停 Ctrl+z
其实博主在入门时就发现了如果一个错误的指令在执行中你想中断它,
Ctrl+z
和
Ctrl+c
都可以,但是当时并不知道有什么区别,今天就来告诉下曾经的自己;
-
Ctrl+c
:终止正在执行的Job,不可恢复,只能重新再执行; -
Ctrl+z
:暂停命令,Job还在后台暂停,有指令可恢复;
# 博主在编辑test.sh,突然想到要去先copy个文件,不然定时任务要报错了,这个时候你除了按wq!保存外,还有个办法,在通用模式下按一下ctrl+z
# 按下ctrl+z,使得该进程被停止
[hadoop@centos-7 doc]$ vim test.sh
[1]+ 已停止 vim test.sh
3.3 jobs指令观察背景中的进程
-
jobs
: 观察背景中的进程
参数
-l:列出所有后端进程。含job numbers和PID
-s:列出stop的后端进程。
-r:列出run的后端进程。
# 利用
[hadoop@centos-7 doc]$ jobs
[1]+ 已停止 vim test.sh
[hadoop@centos-7 doc]$ jobs -l
[1]+ 7940 停止 vim test.sh
[hadoop@centos-7 doc]$ jobs -lr
[hadoop@centos-7 doc]$ jobs -ls
[1]+ 7940 停止 vim test.sh
3.4 fg指令继续处理后端stop的进程
-
fg %numbers
:继续将后端stop的进程拿到前端执行,numbers为
jobs
查看到的stop那个
[1]
里面数字;
%
可有可无;
# 查到序号stop的vim test.sh序号为1
[hadoop@centos-7 doc]$ jobs -l
[1]+ 7940 停止 vim test.sh
# 将stop的序号1的拿到前端来执行
[hadoop@centos-7 doc]$ fg %1
vim test.sh
# 继续编辑test.sh,按wq!保存后发现test.sh文件顺利生成了
[hadoop@centos-7 doc]$ ll
总用量 8
-rw-rw-r--. 1 hadoop hadoop 99 2月 17 13:54 pay.txt
-rw-rw-r--. 1 hadoop hadoop 18 2月 21 16:59 test.sh
3.4 bg指令将后端stop的进程变成run
-
bg %numbers
:将后端stop的进程变成run,numbers为
jobs
查看到的stop那个
[1]
里面数字;
%
可有可无;
[hadoop@centos-7 doc]$ sudo find / -perm /7000 >/tmp/text.txt
[sudo] hadoop 的密码:
find: ‘/proc/17812’: 没有那个文件或目录
find: ‘/proc/17833/task/17833/fd/5’: 没有那个文件或目录
find: ‘/proc/17833/task/17833/fdinfo/5’: 没有那个文件或目录
find: ‘/proc/17833/fd/6’: 没有那个文件或目录
find: ‘/proc/17833/fdinfo/6’: 没有那个文件或目录
^Z # 按下ctrl+z
[2]+ 已停止 sudo find / -perm /7000 > /tmp/text.txt
[hadoop@centos-7 doc]$ jobs;bg 2;jobs
[1]- 已停止 vim test.sh
[2]+ 已停止 sudo find / -perm /7000 > /tmp/text.txt
[2]+ sudo find / -perm /7000 > /tmp/text.txt &
[1]+ 已停止 vim test.sh
[2]- 运行中 sudo find / -perm /7000 > /tmp/text.txt &
3.5 kill指令直接移除背景中的进程
-
kill -signal %jobnumber
:直接移除背景中的进程,
-9,-15用的较多
signal
选项与参数:
-l
: 这个是 L 的小写, 列出目前 kill 能够使用的讯号 ( signal) 有哪些?
signal : 代表给予后面接的那个工作什么样的指示啰! 用 man 7 signal 可知:
-1
: 重新读取一次参数的配置文件 ( 类似 reload) ;
-2
: 代表与由键盘输入 [ctrl]-c 同样的动作;
-9
: 立刻强制删除一个工作;
-15
: 以正常的程序方式终止一项工作。 与 -9 是不一样的。
# 查看当前背景中的进程
[hadoop@centos-7 doc]$ jobs -l
[1]+ 17355 停止 (tty 输出) vim test.sh
# 直接移除背景中的进程
[hadoop@centos-7 doc]$ kill -9 %1
[1]+ 已停止 vim test.sh
# 查看当前背景中的进程
[hadoop@centos-7 doc]$ jobs -l
[1]+ 17355 已杀死 vim test.sh
3.6 nohup指令脱机管理
nohup
: 常与
&
并用,
&
指的是在后台运行,但是后台还是依赖终端机的,如果你的任务预计耗时很久,但是其实可能会面临脱机,如果想你的程序脱机后也能运行,就需要加上
nohup
# 启动kibana,并将标准输出、标准输入信息追加到/logs/kibana_log
nohup bin/kibana >> ./logs/kibana_log 2>&1 &
4. 进程管理
4.1 进程的观察ps、top、netstat
-
ps
指令,静态观察进程相关信息,即某个时间点的进程相关信息
选项与参数:
-A : 所有的 process 均显示出来, 与 -e 具有同样的效用;
-a : 不与 terminal 有关的所有 process ;
-u : 有效使用者 ( effective user) 相关的 process ;
x : 通常与 a 这个参数一起使用, 可列出较完整信息。
输出格式规划:
-l : 较长、 较详细的将该 PID 的的信息列出;
-j : 工作的格式 ( jobs format)
-f : 做一个更为完整的输出。
较常用的为
ps -aux
,后续可以加
www
,如
ps -auxwww
来查看更多的详细信息,测试代码如下;
# ps -auxwww查看进程
[hadoop@centos-7 ~]$ ps -auxwww | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193912 7008 ? Ss 2月24 3:44 /sbin/init
root 2 0.0 0.0 0 0 ? S 2月24 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2月24 2:17 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 2月24 0:00 [kworker/0:0H]
…… 省略
# ps -ef查看进程
[hadoop@centos-7 ~]$ ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2月24 ? 00:03:44 /sbin/init
root 2 0 0 2月24 ? 00:00:00 [kthreadd]
…… 省略
# 只查询自己的bash相关进程
[hadoop@centos-7 ~]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 117266 117226 0 80 0 - 29087 do_wai pts/2 00:00:00 bash
0 R 1000 120750 117266 0 80 0 - 38309 - pts/2 00:00:00 ps
#查看crond相关的进程信息
[hadoop@centos-7 ~]$ ps -ef | grep crond
root 6740 1 0 2月24 ? 00:00:02 /usr/sbin/crond -n
hadoop 127871 117266 0 10:50 pts/2 00:00:00 grep --color=auto crond
如果你是初学者,看到这个肯定是一脸懵逼的,甚至还有放弃学的念头,其实这玩意就是列多,但是并非没有规律,其实就是一张二维表,只要你熟悉这些列的表头,就能看得懂这些进程信息了,具体说明如图4.4.1;
4.4.1 ps -aux查看的进程相关信息
更多的ps表头信息可以查看表4.4.1,如
ps -l
相关的表头如下;
表4.4.1 ps查看进程表头的含义
表头 | 含义 |
---|---|
F | 代表这个程序旗标 ( process flags) , 说明这个程序的总结权限, 常见号码有:若为 4 表示此程序的权限为 root ;若为 1 则表示此子程序仅进行复制( fork) 而没有实际执行( exec) 。 |
S | 代表这个程序的状态 ( STAT) , 主要的状态有:R ( Running) : 该程序正在运行中;S ( Sleep) : 该程序目前正在睡眠状态( idle) , 但可以被唤醒( signal) 。D : 不可被唤醒的睡眠状态, 通常这支程序可能在等待 I/O 的情况( ex>打印)T : 停止状态( stop) , 可能是在工作控制( 背景暂停) 或除错 ( traced) 状态;Z ( Zombie) : 僵尸状态, 程序已经终止但却无法被移除至内存外。 |
UID/PID/PPID | 代表“此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码” |
C | 代表 CPU 使用率, 单位为百分比; |
PRI/NI | Priority/Nice 的缩写, 代表此程序被 CPU 所执行的优先顺序, 数值越小代表该程序越快被 CPU 执行。 详细的 PRI 与 NI 将在进程的执行顺序细讲。 |
ADDR/SZ/WCHAN | 都与内存有关, ADDR 是 kernel function, 指出该程序在内存的哪个部分, 如果是个 running 的程序, 一般就会显示“ – ” / SZ 代表此程序用掉多少内存 /WCHAN 表示目前程序是否运行中, 同样的, 若为 – 表示正在运行中。 |
TTY | 登陆者的终端机位置, 若为远端登陆则使用动态终端接口 ( pts/n) ; |
TIME | 使用掉的 CPU 时间, 注意, 是此程序实际花费 CPU 运行的时间, 而不是系统时间; |
CMD | 就是 command 的缩写, 造成此程序的触发程序之指令为何 |
-
top
指令,动态观察进程相关信息,即随时间变化持续观察,如图4.4.2;
选项与参数:
-d : 后面可以接秒数, 就是整个程序画面更新的秒数。 默认是 5 秒;
-b : 以批次的方式执行 top , 还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为文件。
-n : 与 -b 搭配, 意义是, 需要进行几次 top 的输出结果。
-p : 指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令来进行交互:
? : 显示在 top 当中可以输入的按键指令;
C:查看启动进程的命令脚本
P : 以 CPU 的使用资源排序显示;
M : 以 Memory 的使用资源排序显示;
N : 以 PID 来排序喔!
T : 由该 Process 使用的 CPU 时间累积 ( TIME+) 排序。
k : 给予某个 PID 一个讯号 ( signal)
r : 给予某个 PID 重新制订一个 nice 值。
q : 离开 top 软件的按键。
4.4.2 top动态查看的进程相关信息第一行信息为任务队列信息
top
指令的解释如下,其实也是一个表格 ,把每一项的表头读懂即可;
第一行为任务队列信息;
表4.4.2 任务队列信息
内容 | 说明 |
---|---|
12:26:46 | 系统当前时间 |
up 1 day, 13:32 | 系统的运行时间,本机已经运行1天13小时32分钟 |
2 users | 当前登录了两个用户 |
load average: 0.00, 0.00, 0.00 | 系统在之前1分钟,5分钟,15分钟的平均负载。一般认为小于1时,负载较小。如果大于1,系统已经超出负荷。 |
第二行为进程信息;
表4.4.3 进程信息
内容 | 说明 |
---|---|
Tasks: 95 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
94 sleeping | 睡眠的进程 |
0 stopped | 正在停止的进程 |
0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
第三行为CPU信息;
表4.4.4 CPU信息
内容 | 说明 |
---|---|
Cpu(s): 0.1%us | 用户模式占用的CPU百分比 |
0.1%sy | 系统模式占用的CPU百分比 |
0.0%ni | 改变过优先级的用户进程占用的CPU百分比 |
99.7%id | 空闲CPU的CPU百分比 |
0.1%wa | 等待输入/输出的进程的占用CPU百分比 |
0.0%hi | 硬中断请求服务占用的CPU百分比 |
0.1%si | 软中断请求服务占用的CPU百分比 |
0.0%st st(Steal time) | 虚拟时间百分比。就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。 |
第四行为物理内存信息;
表4.4.5 物理内存信息
内容 | 说明 |
---|---|
Mem: 625344k total | 物理内存的总量,单位KB |
571504k used | 已经使用的物理内存数量 |
53840k free | 空闲的物理内存数量,我们使用的是虚拟机,总共只分配了628MB内存,所以只有53MB的空闲内存了 |
65800k buffers | 作为缓冲的内存数量、 |
第五行为交换分区(swap)信息;
表4.4.6 交换分区(swap)信息
内容 | 说明 |
---|---|
Swap: 524280k total | 交换分区(虚拟内存)的总大小 |
0k used | 已经使用的交互分区的大小 |
524280k free | 空闲交换分区的大小 |
409280k cached | 作为缓存的交互分区的大小 |
至于 top 下半部分的画面, 则是每个 process 使用的资源情况。 也是重点,详情如表表4.4.7;
表4.4.7 top 下半部分的画面信息
内容 | 说明 |
---|---|
PID | 每个 process 的 ID 啦! |
USER | 该 process 所属的使用者; |
PR | Priority 的简写, 程序的优先执行顺序, 越小越早被执行; |
NI | Nice 的简写, 与 Priority 有关, 也是越小越早被执行; |
%CPU | CPU 的使用率; |
%MEM | 内存的使用率; |
TIME+ | CPU 使用时间的累加; |
-
pstree
查看进程树,查看进程之间的相关性;
选项与参数:
-A : 各程序树之间的连接以 ASCII 字符来连接;
-U : 各程序树之间的连接以万国码的字符来连接。 在某些终端接口下可能会有错误;
-p : 并同时列出每个 process 的 PID;
-u : 并同时列出每个 process 的所属帐号名称。
[hadoop@centos-7 ~]$ pstree -p
systemd(1)─┬─ModemManager(6107)─┬─{ModemManager}(6124)
│ └─{ModemManager}(6131)
├─NetworkManager(6222)─┬─{NetworkManager}(6229)
│ └─{NetworkManager}(6232)
├─VGAuthService(6076)
├─abrt-watch-log(6113)
├─abrt-watch-log(6115)
├─abrtd(6111)
├─alsactl(6078)
├─anacron(121696)
├─atd(123136)
├─auditd(6035)─┬─audispd(6037)─┬─sedispatch(6039)
│ │ └─{audispd}(6040)
│ └─{auditd}(6036)
├─avahi-daemon(6072)───avahi-daemon(6085)
├─chronyd(6136)
├─crond(6740)
├─cupsd(6718)
├─dbus-daemon(6083)───{dbus-daemon}(6101)
├─dnsmasq(7146)───dnsmasq(7147)
├─firewalld(6161)───{firewalld}(6528)
├─gssproxy(6087)─┬─{gssproxy}(6090)
│ ├─{gssproxy}(6091)
│ ├─{gssproxy}(6092)
│ ├─{gssproxy}(6093)
│ └─{gssproxy}(6094)
…… 省略
-
netstat
或
ss
:追踪网络或查看端口(port)相关的进程
-a : 将目前系统上所有的连线、 监听、 Socket 数据都列出来
-t : 列出 tcp 网络封包的数据
-u : 列出 udp 网络封包的数据
-n : 不以程序的服务名称, 以埠号 ( port number) 来显示;
-l : 列出目前正在网络监听 ( listen) 的服务;
-p : 列出该网络服务的程序 PID
# netstat查看8088端口的PID
[hadoop@centos-7 ~]$ netstat -anp | grep 8088
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 10.210.59.78:8088 :::* LISTEN 10365/java
[hadoop@centos-7 ~]$ ss -anp | grep 8088
tcp LISTEN 0 128 ::ffff:10.210.59.78:8088 :::* users:(("java",pid=10365,fd=220))
4.2 进程的管理kill和killall
进程的管理是通过
kill
传递一个讯号去告知它要关闭还是启动的,常用的的信号如表4.4.8,其实在第三节
工作(Job)管理
中也讲到了
kill
,没错,kill可以帮我们将这个 signal 传送给某个工作 ( %jobnumber) 或者是某个 PID ( 直接输入
数字)。
-
指令
kill signal %jobnumber或PID
: 管理进程或者Job。
表4.4.8 kill常用的信号
代号 | 名称 | 内容 |
---|---|---|
1 | SIGHUP | 启动被终止的程序, 可让该 PID 重新读取自己的配置文件,类似重新启动。 |
2 | SIGINT | 相当于用键盘输入 [ctrl]-c 来中断一个程序的进行。 |
9 | SIGKILL | 代表强制中断一个程序的进行, 如果该程序进行到一半,那么尚未完成的部分可能会有“半产品”产生, 类似 vim会有 .filename.swp 保留下来。 |
15 | SIGTERM | 以正常的结束程序来终止该程序。 由于是正常的终止, 所以后续的动作会将他完成。 不过, 如果该程序已经发生问题, 就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。 |
19 | SIGSTOP | 相当于用键盘输入 [ctrl]-z 来暂停一个程序。 |
以上是是常用的一些信号,一般我们只要记住
1,9,15
,就行了,尤其是
9
,最重要,更多的信号可以查看
man 7 signal
如下;
SIGNAL(7) Linux Programmer's Manual SIGNAL(7)
NAME
signal - 有效信号的清单
描述 (DESCRIPTION)
下面 列出 Linux 支持的 信号. 某些 信号 依赖于 体系结构(architecture).
首先, POSIX.1 描述了 下列 信号.
信号 值 动作 说明
─────────────────────────────────────────────────────────────────────
SIGHUP 1 A 在控制终端上是挂起信号, 或者控制进程结束
SIGINT 2 A 从键盘输入的中断
SIGQUIT 3 C 从键盘输入的退出
SIGILL 4 C 无效硬件指令
SIGABRT 6 C 非正常终止, 可能来自 abort(3)
SIGFPE 8 C 浮点运算例外
SIGKILL 9 AEF 杀死进程信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道中止: 写入无人读取的管道
SIGALRM 14 A 来自 alarm(2) 的超时信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户定义的信号 1
SIGUSR2 31,12,17 A 用户定义的信号 2
SIGCHLD 20,17,18 B 子进程结束或停止
SIGCONT 19,18,25 继续停止的进程
SIGSTOP 17,19,23 DEF 停止进程
SIGTSTP 18,20,24 D 终端上发出的停止信号
SIGTTIN 21,21,26 D 后台进程试图从控制终端(tty)输入
SIGTTOU 22,22,27 D 后台进程试图在控制终端(tty)输出
下面的 信号 定义 在 SUSv2 中, 而 POSIX.1 没有 定义.
信号 值 动作 说明
───────────────────────────────────────────────────────────────────
SIGBUS 10,7,10 C 总线错误 (不正确的内存访问)
SIGPOLL A I/O就绪事件 (Sys V). 等同于SIGIO
SIGPROF 27,27,29 A 系统资源定时器(Profiling timer)超时
SIGSYS 12,-,12 C 用错误参数调用系统例程 (SVID)
SIGTRAP 5 C 跟踪/断点自陷
SIGURG 16,23,21 B 套接口上出现 urgent 情况 (4.2 BSD)
SIGVTALRM 26,26,28 A 虚拟超时时钟 (4.2 BSD)
SIGXCPU 24,24,30 C 超过了CPU时间限制 (4.2 BSD)
SIGXFSZ 25,25,31 C 超过了文件大小限制 (4.2 BSD)
…… 省略
实战,关闭集群上的hive cli进程;
# 一般hive的端口都是10000,除非改过
[hadoop@centos-7 ~]$ ss -anp|grep 10000
tcp LISTEN 0 50 *:10000 *:* users:(("java",pid=973,fd=483))
# 查到对应的pid=973,因为hive是java程序,利用jps查看Java程序,发现有两个RunJar,这里都是hive的进程,973是hive cli,971是hive jdbc
[hadoop@centos-7 ~]$ jps
31941 Jps
971 RunJar
973 RunJar
# 关闭hive cli
[hadoop@centos-7 ~]$ kill -9 973
-
killall -signal
:刚刚看了通过kill来管理进程的流程,发现必须要知道PID,那能不能通过进程名称来管理呢,
killall
就来了,注意,会把带关键字名字的进程,即一组服务全删了,要慎用,最好带上参数
i
;
选项与参数:
-i : interactive 的意思, 互动式的, 若需要删除时, 会出现提示字符给使用者;
-e : exact 的意思, 表示“后面接的 command name 要一致”, 但整个完整的指令
不能超过 15 个字符。
-I : 指令名称( 可能含参数) 忽略大小写。
实战,尝试交互性的关闭
bash
相关的程序。
# 尝试关闭bash程序
[hadoop@centos-7 ~]$ killall -9 -i bash
信号 bash(7373) ? (y/N) n
信号 bash(7471) ? (y/N) n
信号 bash(7834) ? (y/N) n
信号 bash(9805) ? (y/N) n
bash: no process found
4.3 进程的执行顺序
# 注意PRI和NI
[hadoop@centos-7 ~]$ ps -l | more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 7834 7802 0 80 0 - 29087 do_wai pts/1 00:00:00 bash
0 R 1000 50380 7834 0 80 0 - 38309 - pts/1 00:00:00 ps
0 S 1000 50381 7834 0 80 0 - 27546 pipe_w pts/1 00:00:00 more
# 注意PRI和NI
top - 19:22:07 up 2:27, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863252 total, 1325304 free, 236484 used, 301464 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1404652 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9805 hadoop 20 0 113440 1748 1400 S 0.7 0.1 0:19.20 bash
6115 root 20 0 246484 6844 5360 S 0.3 0.4 0:06.97 vmtoolsd
7802 hadoop 20 0 165524 2996 1300 S 0.3 0.2 0:15.17 sshd
当你用
ps -l
和
top
时,有两个表头
PRI(Priority 值)
和
NI(Nice值)
,进程的执行顺序就和这两项属性有关,Priority 值越低表示程序越优先,但是 PRI 是核心动态调整的, 使用者也无权去干涉 PRI ! 那如果你想要调整程序的优先执行序时, 就得要通过 Nice 值了! Nice 值就是上表的 NI 啦! 一般来说, PRI 与 NI 的相关性如下:
PRI( new) = PRI( old) + nice
注意:如果原本的 PRI 是 50 , 并不是给予一个 nice = 5 , 就会让 PRI变成 55 ! 因为 PRI 是系统“动态”决定的, 所以, 虽然 nice 值是可以影响 PRI , 不过, 最终的 PRI 仍是要经过系统分析后才会决定的。
Nice
值可调整的范围为
-20 ~ 19
;其中
root
可随意调整自己或他人程序的
Nice
值, 且范围为
-20 ~ 19
;一般使用者仅可调整自己程序的
Nice
值, 且范围仅为
0 ~ 19
原因是避免一般用户抢占系统资源;且一般使用者仅可将 nice 值越调越高, 例如本来 nice 为 5 , 则未来仅能调整到大于 5;
具体怎么调整某个程序 nice 值呢? 有两种方式, 分别是:
- 一开始执行程序就立即给予一个特定的 nice 值: 用 nice 指令;
- 调整某个已经存在的 PID 的 nice 值: 用 renice 指令。
实战,初始化设置
vim
进程的
Nice
值,然后调整下
vim
的Nice值为-10。
# 初始化vim的Nice值
[root@centos-7 ~]# nice -n -5 vim &
[1] 61305
[root@centos-7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7471 7430 0 80 0 - 29120 do_wai pts/0 00:00:00 bash
4 T 0 61305 7471 0 75 -5 - 37323 do_sig pts/0 00:00:00 vim
0 R 0 61387 7471 0 80 0 - 38309 - pts/0 00:00:00 ps
# 调整vim的Nice值为-10,注意观察PRI值也发生了变化
[root@centos-7 ~]# renice -10 61305
61305 (进程 ID) 旧优先级为 -5,新优先级为 -10
[root@centos-7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7471 7430 0 80 0 - 29120 do_wai pts/0 00:00:00 bash
4 T 0 61305 7471 0 70 -10 - 37323 do_sig pts/0 00:00:00 vim
0 R 0 63411 7471 0 80 0 - 38309 - pts/0 00:00:00 ps
4.4 系统资源查看
-
free
观察系统内存情况
选项与参数:
-b : 直接输入 free 时, 显示的单位是 KBytes, 我们可以使用 b( Bytes) , m( MBytes),k( KBytes) , 及 g( GBytes) 来显示单位喔! 也可以直接让系统自己指定单位 (
-h
,用的最多)。
-t : 在输出的最终结果, 显示实体内存与 swap 的总量。
-s : 可以让系统每几秒钟输出一次, 不间断的一直输出的意思! 对于系统观察挺有效!
-c : 与 -s 同时处理~让 free 列出几次的意思~
实战,查看系统剩余的内存,如下
Mem
那一行显示的是实体内存的量,
Swap
则是内存交换空间的量,如果被大量使用,则证明剩余的实际内存很少了。
total
是总量,
used
是已被使用的量,
free
则是剩余可用的量。 后面的
shared/buffers/cached
则是在已被使用的量当中, 用来作为缓冲及高速缓存的
量, 这些
shared/buffers/cached
的用量中, 在系统比较忙碌时, 可以被释出而继续利用! 因此后面就有一个
available
( 可用的) 数值! 。
# 查看系统剩余的内存
[root@centos-7 ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 237M 1.3G 10M 299M 1.3G
Swap: 2.0G 0B 2.0G
注意:内存要注意 swap 的量。 一般来说, swap 最好不要被使用, 尤其swap 最好不要被使用超过 20% 以上, 如果您发现 swap 的用量超过 20% , 那么, 最好还是买实体内存来插吧! 因为, Swap 的性能跟实体内存实在差很多, 而系统会使用到 swap ,绝对是因为实体内存不足了才会这样做的!
-
uname
查看系统与核心相关信息
选项与参数:
-a
: 所有系统相关的信息, 包括下面的数据都会被列出来,
用的最多
。
-s : 系统核心名称
-r : 核心的版本
-m : 本系统的硬件名称, 例如 i686 或 x86_64 等;
-p : CPU 的类型, 与 -m 类似, 只是显示的是 CPU 的类型!
-i : 硬件的平台 ( ix86)
实战,查看当前系统的相关信息,信息如下,博主的 Linux 主机使用的核心名称为Linux, 而主机名称(hostname)为
centos-7
, 核心的版本为
3.10.0-957.el7.x86_64
, 该核心版本创建的日期为
Thu Nov 8 23:39:32 UTC 2018
, 适用的硬件平台为
x86_64
以上等级的硬件平台,遵循
GNU/Linux
体系。
[root@centos-7 ~]# uname -a
Linux centos-7 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-
uptime
观察系统启动时间与工作负载
实战,就是显示出目前系统已经开机多久的时间,有多少user, 以及 1, 5, 15 分钟的平均负载。
[root@centos-7 ~]# uptime
20:47:38 up 3:53, 3 users, load average: 0.04, 0.04, 0.05
-
dmesg
: 分析核心产生的讯息
实战,系统在开机的时候, 核心会去侦测系统的硬件,所有核心侦测的讯息, 不管是开机时候还是系统运行过程中, 反正只要是核心产生的讯息,都会被记录到内存中的某个保护区段。 dmesg 这个指令就能够将该区段的讯息读出来的! 因为讯息实在太多了, 所以执行时可以加入这个管线指令“ | more ”来使画面暂停。
# 输出所有的核心开机时的信息
[root@centos-7~]# dmesg | more
# 搜寻开机的时候, 硬盘的相关信息为何?
[root@centos-7~]# dmesg | grep -i vda
[ 0.758551] vda: vda1 vda2 vda3 vda4 vda5 vda6 vda7 vda8 vda9
[ 3.964134] XFS ( vda2) : Mounting V4 Filesystem
....( 下面省略) ....
-
vmstat
: 侦测系统资源变化
选项与参数:
-a : 使用 inactive/active( 活跃与否) 取代 buffer/cache 的内存输出信息;
-f : 开机到目前为止, 系统复制 ( fork) 的程序数;
-s : 将一些事件 ( 开机至目前为止) 导致的内存变化情况列表说明;
-S : 后面可以接单位, 让显示的数据有单位。 例如 K/M 取代 Bytes 的容量;
-d : 列出磁盘的读写总量统计表
-p : 后面列出分区, 可显示该分区的读写总量统计表
实战,vmstat 可以侦测“ CPU / 内存 / 磁盘输入输出状态 ”等等, 如果你想要了解一部繁忙的系统到底是哪个环
节最累人, 可以使用 vmstat 分析。
# 每秒查看一次系统资源的变化,共查3次
[root@centos-7 ~]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1312936 2084 305136 0 0 4 1 37 34 0 0 100 0 0
0 0 0 1312796 2084 305136 0 0 0 0 160 147 0 0 100 0 0
0 0 0 1313068 2084 305136 0 0 0 0 158 151 0 0 100 0 0
# 每秒查看磁盘资源变化,共查3次
[root@centos-7 ~]# vmstat -d 1 3
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 9047 26 503201 22608 2409 250 61756 2036 0 20
sr0 18 0 2056 29 0 0 0 0 0 0
sda 9047 26 503201 22608 2409 250 61756 2036 0 20
sr0 18 0 2056 29 0 0 0 0 0 0
sda 9047 26 503201 22608 2409 250 61756 2036 0 20
sr0 18 0 2056 29 0 0 0 0 0 0
程序字段 ( procs)
的项目分别为: r : 等待运行中的程序数量; b: 不可被唤醒的程序数量。 这两个项目越多, 代表系统越忙碌 ( 因为系统太忙, 所以很多程序就无法被执行或一直在等待而无法被唤醒之故) 。
–
内存字段 ( memory)
项目分别为: swpd: 虚拟内存被使用的容量; free: 未被使用的内存容量; buff: 用于缓冲内存; cache: 用于高速缓存内存。 这部份则与 free 是相同的。
内存交换空间 ( swap)
的项目分别为: si: 由磁盘中将程序取出的量; so: 由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so 的数值太大, 表示内存内的数据常常得在磁盘与内存之间传来传去, 系统性能会很差!
磁盘读写 ( io)
的项目分别为: bi: 由磁盘读入的区块数量; bo: 写入到磁盘去的区块数量。 如果这部份的值越高, 代表系统的 I/O 非常忙碌!
系统 ( system)
的项目分别为: in: 每秒被中断的程序次数; cs: 每秒钟进行的事件切换次数; 这两个数值越大, 代表系统与周边设备的沟通非常频繁! 这些周边设备当然包括磁盘、 网卡、 时间钟等。
CPU 的项目
分别为: us: 非核心层的 CPU 使用状态; sy: 核心层所使用的 CPU 状态; id: 闲置的状态; wa: 等待 I/O 所耗费的 CPU 状态; st: 被虚拟机 ( virtual machine) 所盗用的 CPU 使用状态 ( 2.6.11 以后才支持) 。
4.5 进程与文件的关系
刚刚说了程序实在内存里面运行,我们知道Linux上一切皆文件,那内存中的数据又是写入到什么文件呢?没错就是
/proc/*
下;
# 输入一个
[mrcdev@jq-mrc-250068 2]$ passwd
Changing password for user mrcdev.
Changing password for mrcdev.
(current) UNIX password:
# 按ctrl+z挂起
[3]+ Stopped passwd
# 查看后端的jobs 发现刚刚挂起的是编号3的job
[mrcdev@jq-mrc-250068 2]$ jobs
[3]+ Stopped passwd
# 查看对应的内存的数据文件,在/proc/3文件下
[mrcdev@jq-mrc-250068 2]$ ll /proc | more
total 0
dr-xr-xr-x 9 root root 0 Apr 4 2021 1
dr-xr-xr-x 9 root root 0 Apr 4 2021 10
dr-xr-xr-x 9 root root 0 Feb 24 10:20 10298
dr-xr-xr-x 9 root root 0 Feb 24 10:20 10300
……省略……
dr-xr-xr-x 9 root root 0 Apr 4 2021 2
dr-xr-xr-x 9 root root 0 Apr 4 2021 21
……省略……
dr-xr-xr-x 9 root root 0 Apr 4 2021 3
dr-xr-xr-x 9 root root 0 Apr 4 2021 30
……省略……
# 进入/proc/3看看
[mrcdev@jq-mrc-250068 2]$ cd /proc/3
[mrcdev@jq-mrc-250068 3]$ ll
ls: cannot read symbolic link cwd: Permission denied
ls: cannot read symbolic link root: Permission denied
ls: cannot read symbolic link exe: Permission denied
total 0
dr-xr-xr-x 2 root root 0 Nov 24 17:34 attr
-rw-r--r-- 1 root root 0 Mar 9 10:28 autogroup
-r-------- 1 root root 0 Mar 9 10:28 auxv
-r--r--r-- 1 root root 0 Mar 9 10:28 cgroup
--w------- 1 root root 0 Mar 9 10:28 clear_refs
-r--r--r-- 1 root root 0 Apr 4 2021 cmdline
-rw-r--r-- 1 root root 0 Mar 9 10:28 comm
-rw-r--r-- 1 root root 0 Mar 9 10:28 coredump_filter
-r--r--r-- 1 root root 0 Mar 9 10:28 cpuset
lrwxrwxrwx 1 root root 0 Apr 5 2021 cwd
-r-------- 1 root root 0 Mar 9 10:28 environ
lrwxrwxrwx 1 root root 0 Apr 4 2021 exe
dr-x------ 2 root root 0 Apr 5 2021 fd
dr-x------ 2 root root 0 Mar 9 10:28 fdinfo
-rw-r--r-- 1 root root 0 Mar 9 10:28 gid_map
-r-------- 1 root root 0 Apr 22 2021 io
-r--r--r-- 1 root root 0 Apr 22 2021 limits
-rw-r--r-- 1 root root 0 Mar 9 10:28 loginuid
dr-x------ 2 root root 0 Mar 9 10:28 map_files
-r--r--r-- 1 root root 0 Jan 1 06:00 maps
-rw------- 1 root root 0 Mar 9 10:28 mem
-r--r--r-- 1 root root 0 Mar 9 10:28 mountinfo
-r--r--r-- 1 root root 0 Mar 9 10:28 mounts
-r-------- 1 root root 0 Mar 9 10:28 mountstats
dr-xr-xr-x 5 root root 0 Mar 9 10:28 net
dr-x--x--x 2 root root 0 Mar 9 10:01 ns
-r--r--r-- 1 root root 0 Mar 9 10:28 numa_maps
-rw-r--r-- 1 root root 0 Mar 9 10:28 oom_adj
-r--r--r-- 1 root root 0 Mar 9 10:28 oom_score
-rw-r--r-- 1 root root 0 Mar 9 10:28 oom_score_adj
-r--r--r-- 1 root root 0 Mar 9 10:28 pagemap
-r-------- 1 root root 0 Mar 9 10:28 patch_state
-r--r--r-- 1 root root 0 Mar 9 10:28 personality
-rw-r--r-- 1 root root 0 Mar 9 10:28 projid_map
lrwxrwxrwx 1 root root 0 Mar 9 10:28 root
-rw-r--r-- 1 root root 0 Mar 9 10:28 sched
-r--r--r-- 1 root root 0 Mar 9 10:28 schedstat
-r--r--r-- 1 root root 0 Mar 9 10:28 sessionid
-rw-r--r-- 1 root root 0 Mar 9 10:28 setgroups
-r--r--r-- 1 root root 0 Mar 9 10:28 smaps
-r--r--r-- 1 root root 0 Mar 9 10:28 stack
-r--r--r-- 1 root root 0 Apr 4 2021 stat
-r--r--r-- 1 root root 0 Apr 22 2021 statm
-r--r--r-- 1 root root 0 Apr 4 2021 status
-r--r--r-- 1 root root 0 Mar 9 10:28 syscall
dr-xr-xr-x 3 root root 0 Mar 9 10:01 task
-r--r--r-- 1 root root 0 Mar 9 10:28 timers
-rw-r--r-- 1 root root 0 Mar 9 10:28 uid_map
-r--r--r-- 1 root root 0 Mar 9 10:28 wchan
# 重点关注下
#cmdline: 这个程序被启动的指令串;
#environ: 这个程序的环境变量内容
[root@@jq-mrc-250068 3]# cat /proc/1/cmdline
/usr/lib/systemd/systemd--switched-root--system--deserialize24
#是一句执行的命令
再回到
/proc
目录下,
ll
查看下,发现出了刚刚说道的一系列jobs编号相关的文件夹,还有一下文件,如表4.4.9,这些文件作用基本如下,可以适当了解下,有兴趣的可以
cat
观看下里面的内容,对后续自己遇到需要修改一些驱动类的内容有所帮助。
表4.4.9 /proc下的文件简介
文件名 | 文件内容 |
---|---|
/proc/cmdline | 载入 kernel 时所下达的相关指令与参数! 查阅此文件, 可了解指令是如何启动的! |
/proc/cpuinfo | 本机的 CPU 的相关信息, 包含频率、 类型与运算功能等 |
/proc/devices | 这个文件记录了系统各个主要设备的主要设备代号, 与 mknod 有关呢! |
/proc/filesystems | 目前系统已经载入的文件系统啰! |
/proc/interrupts | 目前系统上面的 IRQ 分配状态。 |
/proc/ioports | 目前系统上面各个设备所配置的 I/O 位址。 |
/proc/kcore | 这个就是内存的大小啦! 好大对吧! 但是不要读他啦! |
/proc/loadavg | 还记得 top 以及 uptime 吧? 没错! 上头的三个平均数值就是记录在此! |
/proc/meminfo | 使用 free 列出的内存信息, 嘿嘿! 在这里也能够查阅到! |
/proc/modules | 目前我们的 Linux 已经载入的模块列表, 也可以想成是驱动程序啦! |
/proc/mounts | 系统已经挂载的数据, 就是用 mount 这个指令调用出来的数据啦! |
/proc/swaps | 到底系统挂载入的内存在哪里? 呵呵! 使用掉的 partition 就记录在此啦! |
/proc/partitions | 使用 fdisk -l 会出现目前所有的 partition 吧? 在这个文件当中也有纪录喔! |
/proc/uptime | 就是用 uptime 的时候, 会出现的信息啦! |
/proc/version | 核心的版本, 就是用 uname -a 显示的内容啦! |
/proc/bus/* | 一些总线的设备, 还有 |
还有相关查询某一文件被某个进程使用的相关信息;
-
fuser
: 找出正在使用某一文件或文件夹的程序
用法:
fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u : 除了程序的 PID 之外, 同时列出该程序的拥有者;
-m : 后面接的那个文件名会主动的上提到该文件系统的最顶层, 对 umount 不成功很有效!
-v : 可以列出每个文件与程序还有指令的完整相关性!
-k : 找出使用该文件/目录的 PID , 并试图以 SIGKILL 这个讯号给予该 PID;
-i : 必须与 -k 配合, 在删除 PID 之前会先询问使用者意愿!
-signal: 例如 -1 -15 等等, 若不加的话, 默认是 SIGKILL ( -9)!
# 查看使用家目录下 ~ 的进程
[mrcdev@jq-mrc-250068 proc]$ fuser -uv ~
USER PID ACCESS COMMAND
/home/mrcdev: mrcdev 20428 ..c.. (mrcdev)sleep
mrcdev 24378 ..c.. (mrcdev)bash
- 可以看到有两个进程
PID 20428 ,24378
使用了家目录
/home/mrcdev
,都是隶属于用户
mrcdev
,其中一个是
bash
程序,一个sleep的。- 关于
ACCESS
c : 此程序在当前的目录下( 非次目录) ;
e : 可被触发为执行状态;
f : 是一个被打开的文件;
r : 代表顶层目录 ( root directory) ;
F : 该文件被打开了, 不过在等待回应中;
m : 可能为分享的动态函数库;
-
losf
: 列出被程序所打开的文件
选项与参数:
-a : 多项数据需要“同时成立”才显示出结果时!
-U : 仅列出 Unix like 系统的 socket 文件类型;
-u : 后面接 username, 列出该使用者相关程序所打开的文件;
+d : 后面接目录, 亦即找出某个目录下面已经被打开的文件;
# 列出user mrcdev 程序开启的文件
[mrcdev@jq-mrc-250068 proc]$ lsof -u mrcdev -a
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2107 mrcdev cwd DIR 0,3 0 1 /proc
vim 2107 mrcdev rtd DIR 253,0 269 64 /
vim 2107 mrcdev txt REG 253,0 2294256 50347978 /usr/bin/vim
vim 2107 mrcdev mem REG 253,0 62184 1241 /usr/lib64/libnss_files-2.17.so
vim 2107 mrcdev mem REG 253,0 106070960 50778457 /usr/lib/locale/locale-archive
vim 2107 mrcdev mem REG 253,0 11448 1231 /usr/lib64/libfreebl3.so
vim 2107 mrcdev mem REG 253,0 14872 1260 /usr/lib64/libutil-2.17.so
vim 2107 mrcdev mem REG 253,0 41080 1655 /usr/lib64/libcrypt-2.17.so
…… 省略……
# 列出系统中开启的设备
[mrcdev@jq-mrc-250068 proc]$ lsof +d /dev
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 12998 mrcdev 0w CHR 1,3 0t0 1028 /dev/null
5. SELinux模式
SELinux(Security Enhanced Linux Linux的安全强化模式)
,由美国国家安全局(NSA)开发的建立在权限认证(
rwxrxwrwx
)之上的一层安全机制,本章节做一个适当的了解,具体想学习的可以翻阅相关资料近一步学习。
开启SELinux有什么利弊呢,如图5.1.1,假如你有个网络服务,如apache的网路服务,部署在
/var/www/html
,如果你的访问者是宿主在某一个linux服务器账号user1下,恰好user1对其他文件夹如
\tmp./var/tmp
有读写权限,如果没有SELinux认证,会导致该账号user1可以通过该网络服务访问其他目录,这要是其他目录有重要文件,对于用心不良的人是很危险的,这也就是为啥不建议目录和文件的权限设置为
777(rwxrwxrwx)
的原因。
图5.1.1 apache网络服务访问开启SELinux和不开启SELinux的区别
而开启了SELinux为什么可以限制宿主账号及时有其他文件夹或文件的权限也无法正常访问那些文件呢?是因为SELinux限制服务进程访问相应的文件,除了权限判断之前,还必须做一定的比对,比对的内容包括以下部分,如图5.1.2;
主体 ( Subject)
: SELinux 主要想要管理的就是程序, 因此你可以将“主体”跟本章谈到的 process 划上等号;
目标 ( Object)
: 主体程序能否存取的“目标资源”一般就是文件系统。 因此这个目标项目可以等文件系统划上等号;
政策 ( Policy)
: 由于程序与文件数量庞大, 因此 SELinux 会依据某些服务来制订基本的存取安全性政策。 这些政策内还会有详细的规则 ( rule) 来指定不同的服务开放某些资源的存取与否。 在目前的 CentOS 7.x 里面仅有提供三个主要的政策, 分别是:targeted:针对网络服务限制较多, 针对本机限制较少, 是默认的政策;minimum: 由 target 修订而来, 仅针对选择的程序来保护!mls: 完整的 SELinux 限制, 限制方面较为严格。 建议使用默认的 targeted 政策即可。
安全性本文 ( security context)
: 我们刚刚谈到了主体、 目标与政策面, 但是主体能不能存取目标除了政策指定之外, 主体与目标的安全性本文必须一致才能够顺利存取。 这个安全性本文 ( security context) 有点类似文件系统的 rwx 啦! 安全性本文的内容与设置非常重要的! 如果设置错误, 你的某些服务( 主体程序) 就无法存取文件系统( 目标资源) , 当然就会一直出现“权限不符”的错误讯息了!
图5.1.2 SELinux模式的认证步骤
SElinux的三种模式,如图5.1.3;
-
enforcing
: 强制模式, 代表 SELinux 运行中, 且已经正确的开始限制 domain/type 了; -
permissive
: 宽容模式: 代表 SELinux 运行中, 不过仅会有警告讯息并不会实际限制domain/type 的存取。 这种模式可以运来作为 SELinux 的 debug 之用; -
disabled
: 关闭, SELinux 并没有实际运行。
图5.1.3 SELinux三种模式的区别
实战,查看,切换SELinux模式。
# 查看目前的SELinux 状态
[mrcdev@jq-mrc-250068 ~]$ sestatus
SELinux status: disabled
# 修改默认的SELinux 模式
[mrcdev@jq-mrc-250068 ~]$ vim /etc/selinux/config
SELINUX=enforcing # 调整 enforcing ;disabled ;permissive
SELINUXTYPE=targeted #目前仅有 targeted, mls, minimum 三种政策
# wq!保存,然后重启
[mrcdev@jq-mrc-250068 ~]$ sudo reboot
# 切换SELinux模式,setenforce 无法在 Disabled 的模式下面进行模式的切换喔
# 因为从 Disabled 的下切换回Enforcing ,可能导致一大堆的程序报错权限不足
setenforce [0 ;1]
选项与参数:
0 : 转成 permissive 宽容模式;
1 : 转成 Enforcing 强制模式
6. 服务管理
6.1 程序(program)、进程(process)、守护进程(daemon)与服务(service)的关系
-
程序
:程序猿、程序媛编写的代码; -
进程
:在内存中执行的程序,会分配一个
PID
; -
守护进程
:为了某一个服务常驻内存的程序,即一直在内存中运行; -
服务
:常驻内存程序,可以提供系统或者网络功能,即服务;
注意:实际上守护进程可以等价于服务,因为开启一个服务在后端必有一个守护进程存在,开启守护进程的目的就是为了开启一个服务;只是区别于其他的进程,如一次性就能执行的一些进程
vim,bash
指令等,守护进程往往会加一个
d
结尾,比如
crond,atd
。
6.2 systemctl管理服务
老的版本(CentOS7以前),用的是init启动服务,CentOS7以后,新增了systemd启动服务的机制,为什么是新增呢,因为也没有完全淘汰掉init,那systemd有什么好处呢?
- systemd可以让所有服务同时平行启动,加快开机流程,而init需要一项一项等待;
-
systemd基本就靠
systemctl
指令就行,操作方便,老版本还需要 init,chkconfig, service… 等; - systemd会自动开启依赖的服务,如启动A服务,但是开启A服务器必须要开启B服务,则会帮你开启B服务,减少服务timeout的可能;
- 向下兼容init的服务脚本。
但是systemd又无法完全取代init,主要有以下几个方面;
-
在
runlevel
的对应上, 大概仅有 runlevel 1, 3, 5 有对应到 systemd 的某些 target 类型而已, 没有全部对应,其他的4级,只能用init; - 全部的 systemd 都用 systemctl 这个管理程序管理, 而 systemctl 支持的语法有限制, 不像 /etc/init.d/daemon 就是纯脚本可以自订参数, systemctl 不可自订参数。 ;如果某个服务启动是管理员自己手动执行启动, 而不是使用 systemctl 去启动的 ( 例如你自己手动输入 crond 以启动 crond 服务) , 那么 systemd 将无法侦测到该服务, 而无法进一步管理。
- systemd 启动过程中, 无法与管理员通过 standard input 传入讯息! 因此, 自行撰写
- systemd 的启动设置时, 务必要取消互动机制~( 连通过启动时传进的标准输入讯息也
总之,光是平行启动脚本,就能节约很多时间了,而且一些常用的服务,确实用systemd管理更加方便,所以还是有必要学下;
systemd将过去的daemon执行脚本统称为一个服务单位(
Unit
),而Unit的分类如下,当然其中最常见的是
.service
。
.service
:一般服务类型 ( service unit) : 主要是系统服务, 包括服务器本身所需要的本机服务以及网络服务都是! 比较经常被使用到的服务大多是这种类型! 所以, 这也是最常见的类型了!
.socket
: 内部程序数据交换的插槽服务 ( socket unit) : 主要是 IPC ( Interprocess communication) 的传输讯息插槽档 ( socket file) 功能。 这种类型的服务通常在监控讯息传递的插槽档, 当有通过此插槽档传递讯息来说要链接服务时, 就依据当时的状态将该用户的要求传送到对应的daemon, 若 daemon 尚未启动, 则启动该 daemon 后再传送用户的要求。 使用 socket 类型的服务一般是比较不会被用到的服务, 因此在开机时通常会稍微延迟启动的时间 ( 因为比较没有这么常用嘛! ) 。 一般用于本机服务比较多, 例如我们的图形界面很多的软件都是通过 socket 来进行本机程序数据交换的行为。 ( 这与早期的 xinetd 这个 super daemon 有部份的相似喔! )
.target
:执行环境类型 ( target unit) : 其实是一群 unit 的集合, 例如上面表格中谈到的 multi-user.target 其实就是一堆服务的集合~也就是说, 选择执行multi-user.target 就是执行一堆其他 .service 或/及 .socket 之类的服务就是了!
.mount/.automount
:文件系统挂载相关的服务 ( automount unit / mount unit) : 例如来自网络的自动挂载、 NFS 文件系统挂载等与文件系统相关性较高的程序管理。
.path
:侦测特定文件或目录类型 ( path unit) : 某些服务需要侦测某些特定的目录来提供伫列服务, 例如最常见的打印服务, 就是通过侦测打印伫列目录来启动打印功能! 这时就得要 .path 的服务类型支持了!
.timer
:循环执行的服务 ( timer unit) : 这个东西有点类似 anacrontab 喔! 不过是由 systemd 主动提供的, 比 anacrontab 更加有弹性。
接下来利用指令systemctl管理服务实战篇;
-
指令:
systemctl [command] [unit]
command
选项主要有:
start
: 立刻启动后面接的 unit
stop
: 立刻关闭后面接的 unit
restart
: 立刻关闭后启动后面接的 unit, 亦即执行 stop 再 start 的意思
reload
: 不关闭后面接的 unit 的情况下, 重新载入配置文件, 让设置生效
enable
: 设置下次开机时, 后面接的 unit 会被启动
disable
: 设置下次开机时, 后面接的 unit 不会被启动
status
: 目前后面接的这个 unit 的状态, 会列出有没有正在执行、 开机默认执行否、 登录等信息等!
is-active
: 目前有没有正在运行中
is-enable
: 开机时有没有默认要启用这个 unit
# 查看防火墙状态,发现状态是inactive ,即关闭的
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
# 开启防火墙
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl start firewalld
# 查看防火墙状态,发现状态是active ,即开启了的
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2022-03-11 10:47:51 CST; 2s ago
Docs: man:firewalld(1)
Main PID: 20829 (firewalld)
CGroup: /system.slice/firewalld.service
└─20829 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Mar 11 10:47:50 jq-mrc-250068.szanba.ren systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 11 10:47:51 jq-mrc-250068.szanba.ren systemd[1]: Started firewalld - dynamic firewall daemon.
# 关闭防火墙
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl stop firewalld
# 再查看状态,发现已经关闭
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
Mar 11 10:47:50 jq-mrc-250068.szanba.ren systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 11 10:47:51 jq-mrc-250068.szanba.ren systemd[1]: Started firewalld - dynamic firewall daemon.
Mar 11 10:48:11 jq-mrc-250068.szanba.ren systemd[1]: Stopping firewalld - dynamic firewall daemon...
Mar 11 10:48:12 jq-mrc-250068.szanba.ren systemd[1]: Stopped firewalld - dynamic firewall daemon.
注意查看防火墙状态的第三行,
Active: inactive (dead)
,这个Active有哪些类型呢?
active ( running)
: 正有一只或多只程序正在系统中执行的意思, 举例来说, 正在执行中的 vsftpd 就是这种模式。
active ( exited)
: 仅执行一次就正常结束的服务, 目前并没有任何程序在系统中执行。
active ( waiting)
: 正在执行当中, 不过还再等待其他的事件才能继续处理。 举例来说, 打印的伫列相关服务就是这种状态! 虽然正在启动中, 不过, 也需要真的有伫列进来 ( 打印工作) 这样他才会继续唤醒打印机服务来进行下一步打印的功能,即面对临界资源的竞争时发生。
inactive
: 这个服务目前没有运行的意思。
当然daemon 的也有默认状态,一般记录在服务的配置文件上,分类如下。
enabled
: 这个 daemon 将在开机时被执行
disabled
: 这个 daemon 在开机时不会被执行
static
: 这个 daemon 不可以自己启动 ( enable 不可) , 不过可能会被其他的 enabled的服务来唤醒 ( 相依属性的服务)
mask
: 这个 daemon 无论如何都无法被启动! 因为已经被强制注销 ( 非删除) 。 可通过
systemctl unmask
方式改回原本状态.
# mask 防火墙服务
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl mask firewalld
[sudo] password for mrcdev:
Created symlink from /etc/systemd/system/firewalld.service to /dev/null.
# 查看防火墙状态,发现已经mask了
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl status firewalld
● firewalld.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
Mar 11 10:47:50 jq-mrc-250068.szanba.ren systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 11 10:47:51 jq-mrc-250068.szanba.ren systemd[1]: Started firewalld - dynamic firewall daemon.
Mar 11 10:48:11 jq-mrc-250068.szanba.ren systemd[1]: Stopping firewalld - dynamic firewall daemon...
Mar 11 10:48:12 jq-mrc-250068.szanba.ren systemd[1]: Stopped firewalld - dynamic firewall daemon.
# 启动防火墙,报错,说该Unit已经被mask
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl start firewalld
Failed to start firewalld.service: Unit is masked.
# 解除防火墙的mask状态
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl unmask firewalld
Removed symlink /etc/systemd/system/firewalld.service.
# 启动防火墙并观察防火墙状态
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl start firewalld
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2022-03-11 11:01:51 CST; 3s ago
Docs: man:firewalld(1)
Main PID: 28486 (firewalld)
CGroup: /system.slice/firewalld.service
└─28486 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Mar 11 11:01:51 jq-mrc-250068.szanba.ren systemd[1]: Starting firewalld - dynamic firewall daemon...
Mar 11 11:01:51 jq-mrc-250068.szanba.ren systemd[1]: Started firewalld - dynamic firewall daemon.
systemctl除了开启,关闭服务外,还可以查看系统上的服务;
-
指令
systemctl [command] [--type=TYPE] [--all]
command选项:
list-units
: 依据 unit 列出目前有启动的 unit。 若加上 –all 才会列出没启动的。
ist-unit-files
: 依据 /usr/lib/systemd/system/ 内的文件, 将所有文件列表说明。
–type=TYPE: 就是之前提到的 unit type, 主要有 service, socket, target。
# 查看系统上有启动的服务
[mrcdev@jq-mrc-250068 ~]$ systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Auto
sys-devices-pci0000:00-0000:00:11.0-0000:02:01.0-ata3-host2-target2:0:0-2:0:0:0-block-sr0.device loaded active plugged VMwa
sys-devices-pci0000:00-0000:00:15.0-0000:03:00.0-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loaded active plugged Virt
sys-devices-pci0000:00-0000:00:15.0-0000:03:00.0-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loaded active plugged LVM
sys-devices-pci0000:00-0000:00:15.0-0000:03:00.0-host0-target0:0:0-0:0:0:0-block-sda.device loaded active plugged Virtual_d
sys-devices-pci0000:00-0000:00:15.0-0000:03:00.0-host0-target0:0:1-0:0:1:0-block-sdb.device loaded active plugged LVM PV Sy
sys-devices-pci0000:00-0000:00:16.0-0000:0b:00.0-net-ens192.device loaded active plugged VMXNET3 Ethernet Controller
sys-devices-platform-serial8250-tty-ttyS0.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS0
sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS1
sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS2
sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS3
sys-devices-virtual-block-dm\x2d0.device loaded active plugged /sys/devices/virtual/block/dm-0
sys-devices-virtual-block-dm\x2d1.device loaded active plugged /sys/devices/virtual/block/dm-1
sys-devices-virtual-block-dm\x2d2.device loaded active plugged /sys/devices/virtual/block/dm-2
sys-module-configfs.device loaded active plugged /sys/module/configfs
sys-subsystem-net-devices-ens192.device loaded active plugged VMXNET3 Ethernet Controller
-.mount loaded active mounted /
boot.mount loaded active mounted /boot
data.mount loaded active mounted /data
dev-hugepages.mount loaded active mounted Huge Pages File System
……省略……
# 查看系统上已安装的服务
[mrcdev@jq-mrc-250068 ~]$ systemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount disabled
brandbot.path enabled
systemd-ask-password-console.path static
systemd-ask-password-plymouth.path static
systemd-ask-password-wall.path static
session-1.scope static
session-329771.scope static
session-494416.scope static
session-53130.scope static
session-63090.scope static
session-631384.scope static
session-671125.scope static
session-671126.scope static
arp-ethers.service disabled
auditd.service enabled
autovt@.service enabled
……省略……
# 仅仅列出service
[mrcdev@jq-mrc-250068 ~]$ systemctl list-units --type=service -all
UNIT LOAD ACTIVE SUB DESCRIPTION
auditd.service loaded active running Security Auditing Service
brandbot.service loaded inactive dead Flexible Branding Service
chronyd.service loaded active running NTP client/server
cpupower.service loaded inactive dead Configure CPU power related settings
crond.service loaded active running Command Scheduler
……省略……
# 查看防火墙服务
[mrcdev@jq-mrc-250068 ~]$ systemctl list-units --type=service -all | grep firewalld
firewalld.service loaded active running firewalld - dynamic firewall daemon
-
指令
systemctl [command] [unit.target]
,管理不同的操作环境(运行级别、开关机等)
选项与参数:
command:
get-default
: 取得目前的 target
set-default
: 设置后面接的 target 成为默认的操作模式
isolate
: 切换到后面接的模式
而跟操作环境相关的target如下;
graphical.target
: 就是文字加上图形界面, 这个项目已经包含了下面的 multi-user.target
项目!
multi-user.target
: 纯文本模式!
rescue.target
: 在无法使用 root 登陆的情况下, systemd 在开机时会多加一个额外的暂
时系统, 与你原本的系统无关。 这时你可以取得 root 的权限来维护你的系统。 但是这是
额外系统, 因此可能需要动到 chroot 的方式来取得你原有的系统喔! 再后续的章节我们
再来谈!
emergency.target
: 紧急处理系统的错误, 还是需要使用 root 登陆的情况, 在无法使用
rescue.target
时, 可以尝试使用这种模式!
shutdown.target
: 就是关机的流程。
getty.target
: 可以设置你需要几个 tty 之类的, 如果想要降低 tty 的项目, 可以修改这个
东西的配置文件!
实战篇;
# 查看机器默认的运行级别,发现为命令行
[mrcdev@jq-mrc-250068 ~]$ systemctl get-default
multi-user.target
# 修改机器默认的运行级别问图形界面
[mrcdev@jq-mrc-250068 ~]$ sudo systemctl set-default graphical.target
[sudo] password for mrcdev:
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
[mrcdev@jq-mrc-250068 ~]# systemctl poweroff 系统关机
[mrcdev@jq-mrc-250068 ~]# systemctl reboot 重新开机
[mrcdev@jq-mrc-250068 ~]# systemctl suspend 进入暂停模式
[mrcdev@jq-mrc-250068 ~]# systemctl hibernate 进入休眠模式
[mrcdev@jq-mrc-250068 ~]# systemctl rescue 强制进入救援模式
[mrcdev@jq-mrc-250068 ~]# systemctl emergency 强制进入紧急救援模式
suspend
: 暂停模式会将系统的状态数据保存到内存中, 然后关闭掉大部分的系统硬件,当然, 并没有实际关机喔! 当使用者按下唤醒机器的按钮, 系统数据会重内存中回复,然后重新驱动被大部分关闭的硬件, 就开始正常运行! 唤醒的速度较快。
hibernate
: 休眠模式则是将系统状态保存到硬盘当中, 保存完毕后, 将计算机关机。 当使用者尝试唤醒系统时, 系统会开始正常运行, 然后将保存在硬盘中的系统状态恢复回
来。 因为数据是由硬盘读出, 因此唤醒的性能与你的硬盘速度有关。
-
指令
systemctl list-dependencies [unit] [--reverse]
,查看服务相关的依赖
选项与参数:
--reverse
: 反向追踪谁使用这个 unit 的意思
实战,查看Unit之间的依赖
# 查看服务之间的依赖
[mrcdev@jq-mrc-250068 ~]$ systemctl list-dependencies
default.target
● ├─auditd.service
● ├─brandbot.path
● ├─chronyd.service
● ├─crond.service
● ├─dbus.service
● ├─irqbalance.service
● ├─kdump.service
● ├─network.service
● ├─nslcd.service
● ├─plymouth-quit-wait.service
● ├─plymouth-quit.service
● ├─rc-local.service
● ├─rhel-configure.service
● ├─rsyslog.service
● ├─salt-minion.service
● ├─sshd.service
● ├─sysstat.service
● ├─systemd-ask-password-wall.path
● ├─systemd-logind.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─systemd-user-sessions.service
● ├─tuned.service
● ├─vmware-tools.service
● ├─zabbix_agentd.service
● ├─basic.target
● │ ├─microcode.service
● │ ├─rhel-dmesg.service
● │ ├─selinux-policy-migrate-local-changes@targeted.service
● │ ├─paths.target
……省略……
6.3 服务相关的目录文件简介
服务不会凭空的出现,那么在Linux的服务是通过在哪里的目录文件来执行的呢,以下就列举一些跟守护进程相关的文件目录;
/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/*
: 几乎所有的服务都会将初始化的一些选项设置写入到这个目录下, 举例来说, mandb 所要更新的 man page 索引中, 需要加入的参数就写入到此目录下的man-db 当中喔! 而网络的设置则写在 /etc/sysconfig/network-scripts/ 这个目录内。 所以, 这个目录内的文件也是挺重要的;
/var/lib/
: 一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。 举例来说, 数
据库管理系统 Mariadb 的数据库默认就是写入 /var/lib/mysql/ 这个目录下啦!
/run/
: 放置了好多 daemon 的暂存盘, 包括 lock file 以及 PID file 等等。
6.4 网络服务与端口(PORT)的关系
服务,除了自己开启以外,也一般还有客户端来访问调用你这个服务,当然客户端可以使你自己本身,也可以是其他机器,众所周知,一台机器是可以开启若干个服务的,那开启服务的主机(服务器)和访问的客户机是怎么分辨不同的服务的呢,这个就需要引入一个
端口(PORT)
的概念;
可以理解为一台服务就是一栋公寓楼,而端口就是每一户人家,如图6.4.1,每个服务一般会有一个
默认的端口
,如
MySQL3306,Hive JDBC 10000,SQL Server 1433
等等,当然你可以改,比如把MySQL改成
13300
,前提是你改用的目标端口必须是在该服务器内未被占用的,如果被占用了,启动服务时就会报错说该端口已被占用,这个时候你就可以通过
ss或netstat
端口查看是哪个服务占用了该端口。
图6.4.1 服务器,客户端与端口的关系
注意:
- 一个端口只能被一个服务占用,而且是先启动先得。
- 端口不是无限多个,一般是65535个,基本够用,而且在你端口还没用完以前,可能已经达到了资源瓶颈,如服务开启太多内存不足、cpu不足,内存不足等,所以正常情况下不必担心端口不够,真不够怎么办,服务部署在新的机器上不就行了?
6.5 注册成service所需的脚本和配置文件
究竟怎么样才能注册成一个service呢,那就必须看看service脚本里面有啥,以远程连接
sshd
为例;
[mrcdev@jq-mrc-250068 system]$ cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
可以看到,一个service文件主要有三个部分,分别是
[Unit]
,
[Service]
,
[Install]
部分,这三个部分分别是什么含义呢?
-
[Unit]
: unit 本身的说明, 以及与其他相依 daemon 的设置, 包括在什么服务之后才启动此 unit 之类的设置值; -
[Service], [Socket], [Timer], [Mount], [Path]..:
不同的 unit type 就得要使用相对应的设置项目。 我们拿的是 sshd.service 来当范本, 所以这边就使用 [Service] 来设置。 这个项目内主要在规范服务启动的脚本、 环境配置文件文件名、 重新启动的方式等等。 -
[Install]
: 这个项目就是将此 unit 安装到哪个 target 里面去的意思!
设置参数时注意;
- 设置项目通常是可以重复的, 例如我可以重复设置两个 After 在配置文件中, 不过, 后面的设置会取代前面的喔! 因此, 如果你想要将设置值归零, 可以使用类似“ After= ”的设
置, 亦即该项目的等号后面什么都没有, 就将该设置归零了 ( reset) 。- 如果设置参数需要有“是/否”的项目 ( 布林值, boolean) , 你可以使用 1, yes, true, on 代
表启动, 用 0, no, false, off 代表关闭! 随你喜好选择啰!
空白行、 开头为 # 或 ; 的那一行, 都代表注解!
设置
[Unit]
部分的参数;
设置参数: 参数意义说明
Description
:就是当我们使用 systemctl list-units 时, 会输出给管理员看的简易说明! 当然, 使用 systemctl status 输出的此服务的说明, 也是这个项目!
Documentation
:这个项目在提供管理员能够进行进一步的文件查询的功能! 提供的文件可以是如下的数据: Documentation=http://www…Documentation=man:sshd( 8)Documentation=file:/etc/ssh/sshd_config
After
:说明此 unit 是在哪个 daemon 启动之后才启动的意思! 基本上仅是说明服务启动的顺序而已, 并没有强制要求里头的服务一定要启动后此unit 才能启动。 以 sshd.service 的内容为例, 该文件提到 After 后面有 network.target 以及 sshd-keygen.service, 但是若这两个 unit 没有启动而强制启动 sshd.service 的话, 那么 sshd.service 应该还是能够启动的! 这与 Requires 的设置是有差异的喔!
Before
:与 After 的意义相反, 是在什么服务启动前最好启动这个服务的意思。不过这仅是规范服务启动的顺序, 并非强制要求的意思。
Requires
:明确的定义此 unit 需要在哪个 daemon 启动后才能够启动! 就是设置相依服务啦! 如果在此项设置的前导服务没有启动, 那么此 unit 就不会被启动!
Wants
:与 Requires 刚好相反, 规范的是这个 unit 之后最好还要启动什么服务比较好的意思! 不过, 并没有明确的规范就是了! 主要的目的是希望创建让使用者比较好操作的环境。 因此, 这个 Wants 后面接的服务如果没有启动, 其实不会影响到这个 unit 本身!
Conflicts
:代表冲突的服务! 亦即这个项目后面接的服务如果有启动, 那么我们
这个 unit 本身就不能启动! 我们 unit 有启动, 则此项目后的服务就不
能启动! 反正就是冲突性的检查啦!
设置
[Service]
部分的参数;
设置参数 参数意义说明
Type
:说明这个 daemon 启动的方式, 会影响到 ExecStart 喔! 一般来说,有下面几种类型 simple: 默认值, 这个 daemon 主要由 ExecStart 接的指令串来启动, 启动后常驻于内存中。 forking: 由 ExecStart 启动的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服务。 原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大多属于这种项目, 例如 httpd 这个 WWW 服务, 当 httpd 的程序因为运行过久因此即将终结了, 则 systemd 会再重新生出另一个子程序持续运行后, 再将父程序删除。 据说这样的性能比较好! ! oneshot:与 simple 类似, 不过这个程序在工作完毕后就结束了, 不会常驻在内存中。 dbus: 与 simple 类似, 但这个 daemon 必须要在取得一个D-Bus 的名称后, 才会继续运行! 因此设置这个项目时, 通常也要设置 BusName= 才行! idle: 与 simple 类似, 意思是, 要执行这个daemon 必须要所有的工作都顺利执行完毕后才会执行。 这类的daemon 通常是开机到最后才执行即可的服务! 比较重要的项目大概是 simple, forking 与 oneshot 了! 毕竟很多服务需要子程序( forking) , 而有更多的动作只需要在开机的时候执行一次( oneshot) , 例如文件系统的检查与挂载啊等等的。
EnvironmentFile
:可以指定启动脚本的环境配置文件! 例如 sshd.service 的配置文件写入到 /etc/sysconfig/sshd 当中! 你也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设置!
ExecStart
:就是实际执行此 daemon 的指令或脚本程序。 你也可以使用ExecStartPre ( 之前) 以及 ExecStartPost ( 之后) 两个设置项目来在实际启动服务前, 进行额外的指令行为。 但是你得要特别注意的是, 指令串仅接受“指令 参数 参数…”的格式, 不能接受 <, >, >>, |, &等特殊字符, 很多的 bash 语法也不支持喔! 所以, 要使用这些特殊的字符时, 最好直接写入到指令脚本里面去! 不过, 上述的语法也不是完全不能用, 亦即, 若要支持比较完整的 bash 语法, 那你得要使用 Type=oneshot 才行喔! 其他的 Type 才不能支持这些字符。
ExecStop
: 与 systemctl stop 的执行有关, 关闭此服务时所进行的指令。
ExecReload
: 与 systemctl reload 有关的指令行为
Restart
:当设置 Restart=1 时, 则当此 daemon 服务终止后, 会再次的启动此服务。 举例来说, 如果你在 tty2 使用文字界面登陆, 操作完毕后登出, 基本上, 这个时候 tty2 就已经结束服务了。 但是你会看到屏幕又立刻产生一个新的 tty2 的登陆画面等待你的登陆! 那就是 Restart的功能! 除非使用 systemctl 强制将此服务关闭, 否则这个服务会源源不绝的一直重复产生!
RemainAfterExit
:当设置为 RemainAfterExit=1 时, 则当这个 daemon 所属的所有程序
都终止之后, 此服务会再尝试启动。 这对于 Type=oneshot 的服务很有帮助!
TimeoutSec
:若这个服务在启动或者是关闭时, 因为某些缘故导致无法顺利“正常启动或正常结束”的情况下, 则我们要等多久才进入“强制结束”的状态!
KillMode
:可以是 process, control-group, none 的其中一种, 如果是 process则 daemon 终止时, 只会终止主要的程序 ( ExecStart 接的后面那串指令) , 如果是 control-group 时, 则由此 daemon 所产生的其他。
control-group
: 的程序, 也都会被关闭。 如果是 none 的话, 则没有程序会被关闭喔!
RestartSec
:与 Restart 有点相关性, 如果这个服务被关闭, 然后需要重新启动时, 大概要 sleep 多少时间再重新启动的意思。 默认是 100ms ( 毫秒)。
设置
[Install]
部分的参数;
设置参数 参数意义说明
WantedBy
:这个设置后面接的大部分是 *.target unit ! 意思是, 这个 unit 本身是附挂在哪一个 target unit 下面的! 一般来说, 大多的服务性质的 unit 都是附挂在multi-user.target 下面!
Also
:当目前这个 unit 本身被 enable 时, Also 后面接的 unit 也请 enable 的意思! 也就是具有相依性的服务可以写在这里呢!
Alias
:进行一个链接的别名的意思! 当 systemctl enable 相关的服务时, 则此服务会进行链接文件的创建! 以 multi-user.target 为例, 这个家伙是用来作为默认操作环境default.target 的规划, 因此当你设置用成 default.target时, 这个 /etc/systemd/system/default.target 就会链接到/usr/lib/systemd/system/multi-user.target 啰!
实战篇,自己注册一个服务,用来备份
/home/mrcdev
就是自己家目录下的文件,可能你会说,那我写几行代码不就结束了吗?对,但是刚刚也说了,利用systemd管理服务的好处,这里就小题大做注册成服务来一把;
# 在家目录下创建个文件夹
[mrcdev@jq-mrc-250068 ~]$ mkdir -p /home/mrcdev/backups
# 先写个脚本备份/home/mrcdev
[mrcdev@jq-mrc-250068 ~]$ vim backup_home_mrcdev.sh
#! /bin/bash
source_path="/home/mrcdev"
target="/home/mrcdev/backups/backup-home-mrcdev-$(date +%Y-%m-%d,%H:%m:%s).tar.gz"
[ ! -d /backups ] && mkdir -p /home/mrcdev/backups
nohup tar -zcvf ${target} ${source_path} > /home/mrcdev/backups/backup.log 2>&1 &
#内容如上,记得wq!保存
# 注册成service
[mrcdev@jq-mrc-250068 backups]$ sudo vim /etc/systemd/system/backup_home_mrdev.service
[Unit]
Description=backup mrcdev home
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c " echo /home/mrcdev/backups/backup_home_mrcdev.sh | at now"
[Install]
WantedBy=multi-user.target
# 因为 ExecStart 里面有用到 at 这个指令, 因此, atd.service 就是一定要的服务!
#内容如上,记得wq!保存
# 重载服务
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl daemon-reload
# 切换到备份目录,查看下当前目录只有一个备份脚本
[mrcdev@jq-mrc-250068 backups]$ cd /home/mrcdev/backups/
[mrcdev@jq-mrc-250068 backups]$ ll
total 4
-rwxr-xr-x 1 mrcdev mrcdev 260 Mar 11 17:14 backup_home_mrcdev.sh
# 查看下备份服务,发现处于 inactive (dead)
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl status backup_home_mrdev.service
● backup_home_mrdev.service - backup mrcdev home
Loaded: loaded (/etc/systemd/system/backup_home_mrdev.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Mar 11 17:31:39 jq-mrc-250068.szanba.ren systemd[1]: Started backup mrcdev home.
Mar 11 17:31:39 jq-mrc-250068.szanba.ren systemd[1]: Starting backup mrcdev home...
Mar 11 17:31:39 jq-mrc-250068.szanba.ren bash[2151]: job 1 at Fri Mar 11 17:31:00 2022
Mar 11 17:40:33 jq-mrc-250068.szanba.ren systemd[1]: Started backup mrcdev home.
Mar 11 17:40:33 jq-mrc-250068.szanba.ren systemd[1]: Starting backup mrcdev home...
Mar 11 17:40:33 jq-mrc-250068.szanba.ren bash[6769]: job 2 at Fri Mar 11 17:40:00 2022
# 启动服务
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl start backup_home_mrdev.service
# 查看下当前目录,发现付了back的tar包和日志文件,说明刚刚的启动服务完成了脚本内容
[mrcdev@jq-mrc-250068 backups]$ ll
total 131016
-rw-r--r-- 1 root root 83443712 Mar 11 17:44 backup-home-mrcdev-2022-03-11,17:03:1646991872.tar.gz
-rwxr-xr-x 1 mrcdev mrcdev 260 Mar 11 17:14 backup_home_mrcdev.sh
-rw-r--r-- 1 root root 199 Mar 11 17:44 backup.log
# 再次查看服务,发现状态为inactive (dead),因为是一次性服务,执行完了就变回了此状态
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl status backup_home_mrdev.service
● backup_home_mrdev.service - backup mrcdev home
Loaded: loaded (/etc/systemd/system/backup_home_mrdev.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Mar 11 17:31:39 jq-mrc-250068.szanba.ren systemd[1]: Started backup mrcdev home.
Mar 11 17:31:39 jq-mrc-250068.szanba.ren systemd[1]: Starting backup mrcdev home...
Mar 11 17:31:39 jq-mrc-250068.szanba.ren bash[2151]: job 1 at Fri Mar 11 17:31:00 2022
Mar 11 17:40:33 jq-mrc-250068.szanba.ren systemd[1]: Started backup mrcdev home.
Mar 11 17:40:33 jq-mrc-250068.szanba.ren systemd[1]: Starting backup mrcdev home...
Mar 11 17:40:33 jq-mrc-250068.szanba.ren bash[6769]: job 2 at Fri Mar 11 17:40:00 2022
Mar 11 17:44:32 jq-mrc-250068.szanba.ren systemd[1]: Started backup mrcdev home.
Mar 11 17:44:32 jq-mrc-250068.szanba.ren systemd[1]: Starting backup mrcdev home...
Mar 11 17:44:32 jq-mrc-250068.szanba.ren bash[8840]: job 3 at Fri Mar 11 17:44:00 2022
[mrcdev@jq-mrc-250068 backups]$ systemctl enable backup_home_mrdev.service
6.6 利用timer配置文件设置服务开机自动启动
当你需要定期执行,或者开机执行某一个服务时 ,第一印象想到的可能是crond或者atd,但是仔细想想service都已经常驻内存了,为什么还要再通过别人来调用执行呢,不能直接定期自己跑一下吗?当然是可以的,就要借助
timer
;
systemd.timer
的好处;
- 各项 timer 的工作可以跟 systemd 的服务相结合;
-
各项 timer 的工作可以跟 control group ( cgroup, 用来取代 /etc/secure/limit.conf 的功
能) 结合, 来限制该工作的资源利用
systemd.timer
的使用条件。
- 系统的 timer.target 一定要启动
- 要有个 sname.service 的服务存在 ( sname 是你自己指定的名称)
- 要有个 sname.timer 的时间启动服务存在
systemd.timer
的设置参数的说明。
设置参数 参数意义说明
OnActiveSec
: 当 timers.target 启动多久之后才执行这只 unit
OnBootSec
:当开机完成后多久之后才执行
OnStartupSec
: 当 systemd 第一次启动之后过多久才执行
OnUnitActiveSec
这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后, 隔多久后再执行一次的意思
OnUnitInactiveSec
: 这个 timer 配置文件所管理的那个 unit 服务在最后一次停止后, 隔多久再执行一次的意思。
OnCalendar
: 使用实际时间 ( 非循环时间) 的方式来启动服务的意思! 至于时间的格式后续再来谈。
Unit
:一般来说不太需要设置, 因此如同上面刚刚提到的, 基本上我们设置都是 sname.server + sname.timer, 那如果你的 sname 并不相同时, 那在 .timer 的文件中, 就得要指定是哪一个 service unit啰!
Persistent
当使用 OnCalendar 的设置时, 指定该功能要不要持续进行的意思。 通常是设置为 yes , 比较能够满足类似 anacron 的功能喔!
最常用的就是使用于 OnCalendar 的时间,基本上的格式如下所示:
-
语法:
英文周名 YYYY-MM-DD HH:MM:SS
-
范例:
Thu 2022-03-10 13:40:00
上面谈的是基本的语法, 你也可以直接使用间隔时间和英语口语来表示
常用的间隔时间单位有:
us 或 usec: 微秒 ( 10-6 秒)
ms 或 msec: 毫秒 ( 10-3 秒)
s, sec, second, seconds
m, min, minute, minutes
h, hr, hour, hours
d, day, days
w, week, weeks
month, months
y, year, years常用的英文口语
now Thu 2022-03-10 13:50:00
today Thu 2022-03-10 00:00:00
tomorrow Fri2022-03-11 00:00:00
hourly – :00:00
daily –* 00:00:00
weekly Mon –* 00:00:00
monthly –01 00:00:00
+3h10m Thu 2022-03-10 17:00:00
2015-08-16 Sun 2015-08-16 00:00:00
实战,利用
system.timer
设置每分钟备份一下
/home/mrcdev
;
# 查看下times.target是否存在
[mrcdev@jq-mrc-250068 backups]$ systemctl | grep time
timers.target loaded active active Timers
systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories
# 发现存在则编写脚本.time ,注意要跟service名字一样
[mrcdev@jq-mrc-250068 backups]$ sudo vim /etc/systemd/system/backup_home_mrdev.timer
[Unit]
Description=backup my server timer
[Timer]
OnUnitActiveSec=1m
[Install]
WantedBy=multi-user.target
# 内容如上,wq!保存离开
# 重新加载守护进程
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl daemon-reload
# 设置.time开机启动
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl enable backup_home_mrdev.timer
# 重启.time
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl restart backup_home_mrdev.timer
# 查看发现确实每分钟在备份
[mrcdev@jq-mrc-250068 backups]$ ll
total 1817612
-rw-r--r-- 1 root root 109 Mar 11 19:03 1
-rw-r--r-- 1 root root 720568602 Mar 11 19:04 backup-home-mrcdev-2022-03-11,19:03:1646996655.tar.gz
-rw-r--r-- 1 root root 60391424 Mar 11 19:06 backup-home-mrcdev-2022-03-11,19:04:1646996761.tar.gz
-rwxr-xr-x 1 mrcdev mrcdev 260 Mar 11 17:14 backup_home_mrcdev.sh
-rw-r--r-- 1 root root 199 Mar 11 19:06 backup.log
# 关闭.tim备份,不然当心你磁盘
# 关闭.tim备份,不然当心你磁盘
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl stop backup_home_mrdev.timer
# 查看状态,发现已经dead
[mrcdev@jq-mrc-250068 backups]$ sudo systemctl status backup_home_mrdev.timer
● backup_home_mrdev.timer - backup my server timer
Loaded: loaded (/etc/systemd/system/backup_home_mrdev.timer; enabled; vendor preset: disabled)
Active: inactive (dead) since Fri 2022-03-11 19:06:36 CST; 6min ago
Mar 11 19:04:15 jq-mrc-250068.szanba.ren systemd[1]: Stopping backup my server timer.
Mar 11 19:04:15 jq-mrc-250068.szanba.ren systemd[1]: Started backup my server timer.
Mar 11 19:04:15 jq-mrc-250068.szanba.ren systemd[1]: Starting backup my server timer.
Mar 11 19:06:36 jq-mrc-250068.szanba.ren systemd[1]: Stopped backup my server timer.
Mar 11 19:06:36 jq-mrc-250068.szanba.ren systemd[1]: Stopping backup my server timer.
以上就是利用
system.time
是service能够定期或者开机后执行,当然类似的功能也可以利用调度器Azkaban或DolphinScheduler定期调用脚本执行,条条大路通罗马嘛,艺多不压身,多了解一些总是好的。
6.7 CentOS7常用系统服务简介
Linux会开启一些默认的服务,以CentOS7为例,如表6.6.1;
表6.6.1 CentOS7开启的默认服务
服务名称 | 功能简介 |
---|---|
abrtd | ( 系统) abrtd 服务可以提供使用者一些方式, 让使用者可以针对不同的应用软件去设计错误登录的机制, 当软件产生问题时, 使用者就可以根据 abrtd 的登录文件来进行错误克服的行为。 还有其他的abrt-xxx.service 均是使用这个服务来加强应用程序 debug 任务的。 |
accountsdaemon( 可关闭) | ( 系统) 使用 accountsservice 计划所提供的一系列 D-Bus 界面来进行使用者帐号信息的查询。 基本上是与 useradd, usermod,userdel 等软件有关。 |
alsa-X( 可关闭) | ( 系统) 开头为 alsa 的服务有不少, 这些服务大部分都与音效有关! 一般来说, 服务器且不开图形界面的话, 这些服务可以关闭! |
atd ( 系统) | 单一的例行性工作调度, 详细说明请参考第十五章。 抵挡机制的配置文件在 /etc/at.{allow,deny} 喔! |
auditd | ( 系统) 还记得前一章的 SELinux 所需服务吧? 这就是其中一项,可以让系统需 SELinux 稽核的讯息写入 /var/log/audit/audit.log中。 |
avahidaemon( 可关闭) | ( 系统) 也是一个用户端的服务, 可以通过 Zeroconf 自动的分析与管理网络。Zeroconf 较常用在笔记本电脑与行动设备上, 所以我们可以先关闭他啦! |
brandbot rhel-* | ( 系统) 这些服务大多用于开机过程中所需要的各种侦测环境的脚本, 同时也提供网络界面的启动与关闭。 基本上, 你不要关闭掉这些服务比较妥当! |
chronyd ntpd ntpdate | ( 系统) 都是网络校正时间的服务! 一般来说, 你可能需要的仅有chronyd 而已! |
cpupower | ( 系统) 提供 CPU 的运行规范~可以参考/etc/sysconfig/cpupower 得到更多的信息! 这家伙与你的 CPU 使用情况有关喔! |
crond ( 系统) | 系统配置文件为 /etc/crontab, 定时启动任务说明 |
cups( 可关闭) | (系统/网络) 用来管理打印机的服务, 可以提供网络连线的功能,有点类似打印服务器的功能哩! 你可以在 Linux 本机上面以浏览器 的 http://localhost:631 来管理打印机喔! 由于我们目前没有打印机, 所以可以暂时关闭他。 |
dbus | ( 系统) 使用 D-Bus 的方式在不同的应用程序之间传送讯息, 使用的方向例如应用程序间的讯息传递、 每个使用者登陆时提供的讯息数据等。 |
dm-event multipathd | (系统) 监控设备对应表 ( device mapper) 的主要服务, 当然不能关掉啊! 否则就无法让 Linux 使用我们的周边设备与储存设备了! |
dmraid-activation mdmonitor | ( 系统) 用来启动 Software RAID 的重要服务! 最好不要关闭啦!虽然你可能没有 RAID。 |
dracut-shutdown | ( 系统) 用来处理 initramfs 的相关行为, 这与开机流程相关性较高 |
ebtables | ( 系统/网络) 通过类似 iptables 这种防火墙规则的设置方式, 设计网卡作为桥接时的封包分析政策。 其实就是防火墙。 不过与下面谈到的防火墙应用不太一样。 如果没有使用虚拟化, 或者启用了firewalld 防火墙 这个服务可以不启动。 |
emergency rescue | ( 系统) 进入紧急模式或者是救援模式的服务 |
firewalld | ( 系统/网络) 就是防火墙! 以前有 iptables 与 ip6tables 等防火墙机制, 新的 firewalld 搭配 firewall-cmd 指令, 可以快速的创建好你的防火墙系统喔! 因此, 从 CentOS 7.1 以后, iptables 服务的启动脚本已经被忽略了! 请使用 firewalld 来取代 iptables 服务喔! |
gdm | ( 系统) GNOME 的登陆管理员, 就是图形界面上一个很重要的登陆管理服务! |
getty@ | ( 系统) 就是要在本机系统产生几个文字界面 ( tty) 登陆的服务啰! |
hyper ksm libvirt* vmtoolsd | ( 系统) 跟创建虚拟机有关的许多服务! 如果你不玩虚拟机, 那么这些服务可以先关闭。 此外, 如果你的 Linux 本来就在虚拟机的环境下, 那这些服务对你就没有用! 因为这些服务是让实体机器来创建虚拟机的! |
irqbalance | ( 系统) 如果你的系统是多核心的硬件, 那么这个服务要启动, 因为它可以自动的分配系统中断 ( IRQ) 之类的硬件资源。 |
iscsi* | ( 系统) 可以挂载来自网络磁盘机的服务! 这个服务可以在系统内仿真好贵的 SAN 网络磁盘。 如果你确定系统上面没有挂载这种网络磁盘, 也可以将他关闭的。 |
kdump( 可关闭) | ( 系统) 在安装 CentOS 的章节就谈过这东西, 主要是 Linux 核心如果出错时, 用来纪录内存的东西。 鸟哥觉得不需要启动他! 除非你是核心骇客! |
lvm2-* | ( 系统) 跟 LVM 相关性较高的许多服务, 当然也不能关! 不然系统上面的 LVM2 就没人管了! |
microcode | ( 系统) Intel 的 CPU 会提供一个外挂的微指令集提供系统运行,不过, 如果你没有下载 Intel 相关的指令集文件, 那么这个服务不需要启动的, 也不会影响系统运行。 |
ModemManager network NetworkManager* | ( 系统/网络) 主要就是调制解调器、 网络设置等服务! 进入CentOS 7 之后, 系统似乎不太希望我们使用 network 服务了, 比较建议的是使用 NetworkManager 搭配 nmcli 指令来处理网络设置~所以, 反而是 NetworkManager 要开, 而 network 不用开哩! |
quotaon | ( 系统) 启动 Quota 要用到的服务喔! |
rc-local | ( 系统) 相容于 /etc/rc.d/rc.local 的调用方式! 只是, 你必须要让/etc/rc.d/rc.local 具有 x 的权限后, 这个服务才能真的运行! 否则, 你写入 /etc/rc.d/rc.local 的脚本还是不会运行的喔! |
rsyslog | ( 系统) 这个服务可以记录系统所产生的各项讯息, 包括/var/log/messages 内的几个重要的登录文件啊。 |
smartd | ( 系统) 这个服务可以自动的侦测硬盘状态, 如果硬盘发生问题的话, 还能够自动的回报给系统管理员, 是个非常有帮助的服务喔!不可关闭他啊! |
sysstat | ( 系统) 事实上, 我们的系统有只名为 sar 的指令会记载某些时间点下, 系统的资源使用情况, 包括 CPU/流量/输入输出量等, 当sysstat 服务启动后, 这些纪录的数据才能够写入到纪录档 ( log)里面去! |
systemd-* | ( 系统) 大概都是属于系统运行过程所需要的服务, 没必要都不要更动它的默认状态! |
plymount* upower | ( 系统) 与图形界面的使用相关性较高的一些服务! 没启动图形界面时, 这些服务可以暂时不管他! |
当然,还有些服务是工作中可能会用到,但是系统不一定默认开启的,如表6.6.2;
表6.6.2 工作中用到的常用服务
服务名称 | 功能介绍 |
---|---|
dovecot | (网络) 可以设置 POP3/IMAP 等收受信件的服务, 如果你的 Linux 主机是email server 才需要这个服务, 否则不需要启动他啦! |
httpd | ( 网络) 这个服务可以让你的 Linux 服务器成为 www server 喔! |
named | ( 网络) 这是领域名称服务器 ( Domain Name System) 的服务, 这个服务非常重要, 但是设置非常困难! 目前应该不需要这个服务啦! |
nfs nfsserver | ( 网络) 这就是 Network Filesystem, 是 Unix-Like 之间互相作为网络磁盘机的一个功能。 |
smb nmb | ( 网络) 这个服务可以让 Linux 仿真成为 Windows 上面的网络上的芳邻。 如果你的 Linux 主机想要做为 Windows 用户端的网络磁盘机服务器, 这玩意儿得要好好玩一玩。 |
vsftpd | ( 网络) 作为文件传输服务器 ( FTP) 的服务。 |
sshd | ( 网络) 这个是远端连线服务器的软件功能, 这个通讯协定比 telnet 好的地方在于 sshd 在传送数据时可以进行加密喔! 这个服务不要关闭他啦! |
rpcbind | ( 网络) 达成 RPC 协定的重要服务! 包括 NFS, NIS 等等都需要这东西的协助! |
postfix | ( 网络) 寄件的邮件主机~因为系统还是会产生很多 email 讯息! 例如 crond / atd 就会传送 email 给本机用户! 所以这个服务千万不能关! 即使你不是mail server 也是要启用这服务才行! |
以上就是一些CentOS7常用的服务,更多的服务请自行查阅资料。