Linux基础篇——Linux进程服务管理
Posted ╭⌒若隐_RowYet——大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux基础篇——Linux进程服务管理相关的知识,希望对你有一定的参考价值。
文章目录
1. 什么是进程
在此之前需要先了解下什么叫程序,我们这类人通常以程序猿
自嘲,那什么是程序呢?其实程序(program):也通常翻译成binary program,就是程序猿/媛写好存储在硬盘、光盘、软盘、磁带、U盘等存储媒介上的文件对吧
?而什么是进程呢?进程(process):简单而言就是运行的程序;程序被触发后,会伴随着执行者的权限与属性,程序代码以及需要的数据加载到内存中形成一个单元,就叫进程,而操作系统为了好管理它会给这个单元设置一个数字标记符PID(重点),就类似你的学号。
,具体可以参看图1.1;
同时一个进程A在运行中,可能会call起另一个程序B去干活,新生的进程B当然也会得到一个PID,这种情况B就叫A的子进程,A叫B的父进程;A的PID相对B而言就叫PPID,这就是为啥有时候命名你kill了一个进程,过了一会儿又产生了一个新的子进程;这种情况就需要直接kill父进程(允许的前提下);父子进程的关系如图1.2;注意,此图重在说明父子进程,后续指令中会用到,实际父子进程的关系是相对复杂的,有兴趣的可以参看下《操作系统》之类的书籍,此处不作累赘;
2. Linux下进程与执行者的关系(多人多任务环境)
在Linux下,可以有许多的执行者,每个执行者又被叫做用户,每个用户都可以执行自己的程序,即有自己的进程,那这些执行者之间是不是只能等某个先执行自己的程序后另一个执行者才可以去执行自己的程序呢?显然不是的,如图2.1,Linux默认有6个独立得终端窗口,再VM虚拟机上是以Ctrl+Alt+F1~F6
来切换的,每个独立窗口可以各自选择图形界面操作或命令行操作,可以使用不同的执行者做不同的事,从而达到多用户多任务的环境,同一个窗口内,也可以通过su
切换用户来执行不同用户的程序,这种模式有什么优缺点呢?
优点
:多环境相互独立,如果某执行的某个任务卡死,可以在其他环境内利用有权限的执行者帮助其杀死即可,这样就可以继续运行了,这也是linux稳定的原因,基本上很难宕机,服务器可以保证半年,一年甚至更久才需要重启;缺点
:需要关注资源分配问题,人数多了,CPU,内存。磁盘吞吐,网络带宽等性能的竞争也就出来了,需要管理者合理安排,真正达到瓶颈时,也就需要机器扩容升级了。
那对大多数开发而言,平时也是无法直接登录服务器的终端的,那也可以用远程工具模拟这个多人多任务环境,如图2.2利用MobaXterm开多个session登录自己的Linux;
那我们熟悉的window系统有没有这种功能呢?其实也有,个人电脑可能用的少些,但是window服务器,只要你打开任务管理器
也可以看到多用户多环境,当某一个用户卡死时,另一个用户(需要有权限)也可以尝试选中卡死的用户,看看他的是哪个进程卡死,帮助其结束任务
即可;也可以选中用户,帮助其注销
,这样该用户的环境会重启,整台服务器不会重启,这种情况是在解决服务器上别人不卡就你卡的情况。
博主平时工作的关系,Linux和window多人多任务环境都要使用,但是window的远没有linux稳定,极其容易所有用户宕机,导致需要整台服务器重启,所以不论在什么环境下,按时保存。备份关键文件很重要。
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;
更多的ps表头信息可以查看表4.4.1,如ps -l
相关的表头如下;
表头 | 含义 |
---|---|
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 软件的按键。
top
指令的解释如下,其实也是一个表格 ,把每一项的表头读懂即可;
第一行为任务队列信息;
内容 | 说明 |
---|---|
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,系统已经超出负荷。 |
第二行为进程信息;
内容 | 说明 |
---|---|
Tasks: 95 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
94 sleeping | 睡眠的进程 |
0 stopped | 正在停止的进程 |
0 zombie | 僵尸进程。如果不是0,需要手工检查僵尸进程 |
第三行为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的时间百分比。 |
第四行为物理内存信息;
内容 | 说明 |
---|---|
Mem: 625344k total | 物理内存的总量,单位KB |
571504k used | 已经使用的物理内存数量 |
53840k free | 空闲的物理内存数量,我们使用的是虚拟机,总共只分配了628MB内存,所以只有53MB的空闲内存了 |
65800k buffers | 作为缓冲的内存数量、 |
第五行为交换分区(swap)信息;
内容 | 说明 |
---|---|
Swap: 524280k total | 交换分区(虚拟内存)的总大小 |
0k used | 已经使用的交互分区的大小 |
524280k free | 空闲交换分区的大小 |
409280k cached | 作为缓存的交互分区的大小 |
至于 top 下半部分的画面, 则是每个 process 使用的资源情况。 也是重点,详情如表表4.4.7;
内容 | 说明 |
---|---|
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。
代号 | 名称 | 内容 |
---|---|---|
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 : 等待运行中的程以上是关于Linux基础篇——Linux进程服务管理的主要内容,如果未能解决你的问题,请参考以下文章