Linux 进程管理

进程管理

1、进程管理简介

1.1 什么是进程?

进程是正在执行当中的程序(命令),每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。

  • 程序被执行时,执行人的权限和属性、以及程序的代码都会被加载入内存,操作系统就会给这个进程分配一个 ID 号,我们称为 PID(进程 ID)。

1.2 什么是程序?

程序是人使用计算机语言编写的可以实现特定目的或解决特定问题的代码集合。

  • 使用计算机语言编写
  • 可以执行
  • 实现一定功能的代码

1.3 进程管理的作用

  • 判断服务器健康状态:运维工程师最主要的工作就是保证服务器安全稳定的运行。理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,就人为干预解决了问题。进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。

  • 查看系统中所有的进程:我们需要查看系统中所有正在运行的进程,通过这些进程可以判断系统中运行了哪些服务,是否有非法服务运行。

  • 杀死进程:这是进程管理中最不常用的手段,当我需要停止服务时,会通过正确关闭命令来停止服务(如 apache 服务可以通过 systemctl stop apache 来关闭)。只有当正常终止进程的手段失效的情况下,才会考虑使用 kill 命令杀死进程(你不是杀手,不要什么进程都用 kill来终止,否则非常容易导致服务器崩溃)。

1.4 进程的生命周期

当程序运行的时候会由父进程通过fock(一种分支函数)创建子进程来处理任务;子进程被创建后开始处理任务,当任务处理完毕后就会退出,然后子进程会通知父进程来回收资源;如果子进程处理任务期间,父进程意外终止了,那么这个子进程就变成了僵尸进程。

process.png

2、系统状态和进程的查看

2.1 ps命令

ps 命令是用来静态显示系统中进程的命令。

ps命令有些特殊,它的部分命令的选项不能加入“-”,比如命令“ps aux”,其中“aux”是选项,但是这个选项不能加入“-”。这是因为 ps命令的部分选项需要遵守 BSD 操作系统的格式。所以 ps 命令的常用选项的组合是固定的。

注意:

  • 加了 [ ] 的,表示内核进程
  • exiting或defunct表示僵尸进程
[root@localhost ~]# ps aux
#查看系统中所有进程,使用BSD操作系统格式

[root@localhost ~]# ps -ef    /常用的选项ps -ef
#查看系统中所有进程,使用Linux标准命令格式。

选项:
a:	//显示一个终端的所有进程,除了会话引线
u:	//显示进程的归属用户及内存的使用情况
x:	//显示没有控制终端的进程
f:	//查看进程父子关系
k:	//根据进程属性排序,加-表示倒序

-e      //显示所有进程,与-A效果相同
-f      //显示更详细的完整格式的进程信息
-l      //显示更多信息
-u      //显示指定用户启动的进程
-o      //根据自己的需要选择要显示的字段

[root@hzz ~]# ps auxk -%cpu		//根据CPU使用率进行排序,从高到低
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1085  1.2  2.0 159160 37716 ?        S<sl 10月21 133:08 top

[root@localhost ~]# ps -o pid,comm,ni       //表示只显示进程号,命令,nice值三个字段
   PID COMMAND           NI
  8828    bash           0
  9844      ps           0

ps aux输出结果

[root@localhost ~]# ps aux    #查看系统中所有的进程
USER	PID %CPU %MEM	VSZ  RSS TTY  STAT  START  TIME    COMMAND
root	  1  0.0  0.2  2872 1416   ?	Ss  Jun04  0:02    /sbin/init
root	  2  0.0  0.0	  0    0   ?	S   Jun04  0:00    [kthreadd]
输出 含义
USER该进程是由哪个用户产生的;
PID进程的 ID 号;
%CPU该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;
%MEM该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ虚拟内存,该进程向系统申请的内存空间,单位 KB;
RSS物理内存,该进程实际使用的内存空间,单位 KB;
TTY该进程是在哪个终端中运行的。其中 tty1-tty7 代表本地控制台终端(可以通过alt+F1-F7 键切换不同的终端),tty1-tty6 是本地的字符界面终端,tty7 是图形终端。pts/0-255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用的是 pts/0 终端,第二个远程连接占用 pts/1,依次增长;
STAT进程状态;
START该进程的启动时间;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
COMMAND产生此进程的命令;
STAT进程状态状态含义
D不可被唤醒的睡眠状态,通常用于 I/O 情况
R该进程正在运行
S该进程在睡眠状态,可被唤醒
T暂停状态,可能是在后台暂停或进程在出错状态
X死掉的进程(应该不会出现)
Z僵尸进程。进程已经终止,但是部分程序还在内存当中。
<高优先级,S<表示优先级较高的进程
N低优先级,SN表示优先级较低的进程
L被锁入内存
s子进程发起者,Ss表示父进程
l多线程(小写 L),Sl表示进程以多线程运行
+前台进程,R+表示该进程在前台运行,一旦终止,数据丢失

ps -lef输出结果

[root@localhost ~]# ps -lef
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 10822 ep_pol 10月21 ?      00:00:13 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root         2     0  0  80   0 -     0 kthrea 10月21 ?      00:00:00 [kthreadd]
输出含义
F进程标志,说明进程的权限,常见的标志:
1:进程可以复制,但是不能执行
4:进程使用超级用户权限
S进程状态。具体的状态和“ps aux”命令中 STAT 状态一致
UID进程是哪个 UID 用户调用运行的
PID进程的 ID 号
PPID父进程的 ID 号
C该进程的 CPU 使用率,单位是百分比
PRI进程的优先级,数值越小该进程优先级越高,越快被 CPU 执行;动态值由内核决定
NI进程的优先级,也是数值越小越早被执行;静态值管理员手动设置,NI值的范围-20到19之间;
调整已经启动的进程的nice值的命令:renice NI PID
在启动时指定nice值的命令:nice -n 数字 COMMAND
ADDR该进程在内存的哪个位置
SZ该进程占用多大内存
WCHAN该进程是否运行。“-”代表正在运行
STIME该进程的启动时间
TTY该进程由哪个终端产生
TIME该进程占用 CPU 的运算时间,注意不是系统时间
CMD产生此进程的命令名

2.2 pstree命令

pstree命令将所有进程以树状图显示

[root@localhost ~]# pstree [选项]
选项:
-p: 显示进程的 PID
-u: 显示进程的所属用户

#如果没有pstree命令,使用下面命令安装
yum -y install psmisc

2.3 pidof命令

根据进程名查找其PID号

[root@localhost ~]# pidof sshd
8826 1105
[root@localhost ~]# pidof atd
1387

2.4 top命令

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止,比较准确的说,top命令提供了实时的对系统处理器的状态监视;它将显示系统中CPU最“敏感”的任务列表,该命令可以按CPU使用情况,内存使用情况和执行时间对任务进行排序。

[root@localhost ~]# top [选项]

选项:
-d 秒数:  指定 top 命令每隔几秒更新。默认是 3 秒
-n 次数:指定 top 命令执行的次数。一般和“-b”选项合用
-b 使用批处理模式输出。一般和“-n”选项合用,用于把 top 命令重定向到文件中
-p 指定PID。只查看某个 PID 的进程
-s 使top 在安全模式运行,避免在交互模式中出现错误
-u 用户名:只监听某个用户的进程

在 top 命令的交互模式当中可以执行的命令:
?或 h:	显示交互模式的帮助
P:以 CPU 使用率排序,默认就是此项
M:以内存的使用率排序
N:以 PID 排序
T:按照 CPU 的累积运算时间排序,也就是用 TIME+项排序
k:按照 PID 号,给予某个进程一个信号。一般用于终止某个进程,信号 9是强制终止的信号
r:按照 PID 号,给某个进程重设优先级(Nice)值
q:退出 top

top输出结果

[root@localhost ~]# top
top - 13:44:21 up 4 days, 16:01,  2 users,  load average: 0.00, 0.01, 0.05
Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.0 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1883724 total,   144992 free,   948956 used,   789776 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1539352 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND        
 1119 root      10 -10  146420  29512   5956 S  1.3  1.6  71:48.53 AliYunDun      
 1317 root      20   0 2070408  62124   3296 S  0.3  3.3  28:04.11 java           

命令的输出,top 命令的输出内容是动态的,默认每 3 秒刷新一次。命令的输出主要分为两大部分:第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出判断服务器的健康状态;第二部分从第六行开始,显示的是系统中进程的信息。

top 命令的第一部分输出

第一行为任务队列信息:

top - 13:44:21 up 4 days, 16:01,  2 users,  load average: 0.00, 0.01, 0.05
输出含义
13:44:21系统当前时间
up 4 days, 16:01系统的运行时间,本机已经运行 4 天 16 小时 1 分钟
2 users当前登录了两个用户
load average: 0.00, 0.01, 0.05系统在之前 1 分钟,5 分钟,15 分钟的平均负载。
如果 CPU 是单核,则这个数超过 1,就是高负载。
如果 CPU 是四核,则这个数超过 4,就是高负载。
(这个平均负载完全是个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数。)

第二行为进程信息:

Tasks:  84 total,   1 running,  83 sleeping,   0 stopped,   0 zombie
输出含义
84 total系统中的进程总数
1 running正在运行的进程数
83 sleeping睡眠的进程
0 stopped正在停止的进程
0 zombie僵尸进程。如果不是 0,需要手工检查僵尸进程

第三行为 CPU 信息:

%Cpu(s):  2.0 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
输出含义
2.0 us用户模式占用的 CPU 百分比
2.0 sy系统模式占用的 CPU 百分比
0.0 ni改变过优先级的用户进程占用的 CPU 百分比
96.0 id空闲 CPU 的 CPU 百分比
0.0 wa等待输入/输出的进程的占用 CPU 百分比
0.0 hi硬中断请求服务占用的 CPU 百分比
0.0 si软中断请求服务占用的 CPU 百分比
0.0 stst(Steal time)虚拟时间百分比。就是当有虚拟机时,
虚拟 CPU 等待实际 CPU 的时间百分比

第四行为物理内存信息:

KiB Mem :  1883724 total,   144992 free,   948956 used,   789776 buff/cache
输出含义
1883724 total物理内存的总量,单位 KB/MB
144992 free空闲的物理内存数量,我们使用的是虚拟机,
总共分配了 2G 内存,所以只有 0.14G 的空闲内存了
948956 used已经使用的物理内存数量
789776 buff/cache作为缓冲的内存数量

第五行为交换分区(swap)信息:

KiB Swap:  2097148 total,  2097148 free,        0 used.  1539352 avail Mem
输出含义
2097148 total交换分区(虚拟内存)的总大小
2097148 free空闲交换分区的大小
0 used已经使用的交互分区的大小
1539352 avail Mem可用交换分区总量

top 命令的第二部分输出

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND        
 1119 root      10 -10  146420  29512   5956 S  1.3  1.6  71:48.53 AliYunDun      
 1317 root      20   0 2070408  62124   3296 S  0.3  3.3  28:04.11 java           
  • 主要是系统进程信息。这部分和 ps 命令的输出比较类似,只是如果在终端中执行 top 命令不能看到所有的进程,而只能看到占比靠前的进程。
输出含义
PID进程 ID
USER该进程所属的用户
PR优先级,数值越小优先级越高
NI优先级,数值越小优先级越高
VIRT该进程使用的虚拟内存的大小,单位 KB
RES该进程使用的物理内存的大小,单位 KB
SHR共享内存大小,单位 KB
S进程状态
%CPU该进程占用 CPU 的百分比
%MEM该进程占用内存的百分比
TIME+该进程总共占用的 CPU 时间
COMMAND进程的命令名

top使用实例

#top 命令常用的实例。
比如我如果只想让 top 命令查看某一个进程,这时就可以使用“-p 选项”:

[root@localhost ~]# top -p 15273    #只查看 PID 为 15273 的 apache 进程

在 top 命令的交互界面中按“q”键会退出 top 命令。
按“?”或“h”得到 top 命令交互界面的帮助信息。

按“k”键终止某个进程,命令如下:
[root@localhost ~]# top
top - 13:20:05 up  3:32,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 157 total,   2 running, 155 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us,  2.3 sy,  0.0 ni, 96.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867024 total,  1269720 free,   148216 used,   449088 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1513848 avail Mem 
PID to kill:15273    按“k”键,会提示输入要杀死进程的 PID

#让 top 命令只执行一次,然后把结果保存到 top.log 文件中。这样就能看到所有的进程信息
[root@localhost ~]# top -n 1 -b > /root/top.log

查看cpu核心数

配置文件 /proc/cpuinfo 存放着cpu信息。

#查询结果有几行,cpu就有几核。
[root@hzz ~]# grep 'model name' /proc/cpuinfo
model name      : Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz

2.5 vmstat命令

vmstat 命令监控系统资源。

vmstat 刷新延时 刷新次数

[root@hzz ~]# vmstat 1 3
#使用 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
 2  0      0 1404464   2788 314388    0    0    10     5  213  209  3  5 92  0  0
 0  0      0 1404104   2788 314420    0    0     0     0  209  199  3  4 93  0  0
 0  0      0 1403936   2788 314468    0    0     0     0  328  259  6 11 83  0  0

procs:进程信息字段:

字段含义
r等待运行的进程数,数量越大,系统越繁忙。
b阻塞队列长度,也即不可被唤醒的进程数量,数量越大,系统越繁忙。

memory:内存信息字段:

字段含义
swpd虚拟内存的使用情况,单位 KB。
free空闲的内存容量,单位 KB。
buffbuffer缓冲的内存容量,单位 KB。
cachecache缓存的内存容量,单位 KB。

swap:交换分区的信息字段:

字段含义
si     从磁盘中交换到内存中数据的数量,单位 KB。
so从内存中交换到磁盘中数据的数量,单位 KB。此两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差。

io:磁盘读写信息字段:

字段含义
bi从块设备读入数据的总量,单位是块。
bo写到块设备的数据的总量,单位是块。此两个数越大,代表系统的 I/O 越繁忙。

system:系统信息字段:

字段含义
in     每秒被中断的进程次数。
cs每秒钟进行的事件切换次数。此两个数越大,代表系统与接口设备的通信非常繁忙。

CPU:CPU 信息字段:

字段含义
us非内核进程消耗 CPU 运算时间的百分比。
sy内核进程消耗 CPU 运算时间的百分比。
id空闲 CPU 的百分比。
wa等待 I/O 所消耗的 CPU 百分比。
st被虚拟机所盗用的 CPU 占比。

2.6 lsof命令

lsof命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

lsof [选项]

-a		//列出打开文件存在的进程;
-p <进程号>	//列出指定进程号所打开的文件;
-c <进程名>	//列出指定进程所打开的文件;
-d <文件>	//列出占用该文件的进程;
+d <目录>	//列出目录下被打开的文件;
+D <目录>	//递归列出目录下被打开的文件;
-i <条件>	//列出网络连接情况(4、6、协议、:端口、 @ip );
-u		//列出指定用户UID号进程详情;

lsof输出各列信息的意义如下:

字段含义
COMMAND进程的名称
PID进程标识符
PPID父进程标识符(需要指定-R参数)
USER进程所有者
PGID进程所属组
FD文件描述符,程序通过文件描述符识别该文件
DEVICE指定磁盘的名称
SIZE文件的大小
NODE索引节点(文件在磁盘上的标识)
NAME打开文件的确切名称
演示示例:

#列出所有打开的文件,如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
[root@hzz ~]# lsof

# 查看谁正在使用某个文件
[root@hzz ~]# lsof   /filepath/file

#递归查看某个目录的文件信息,使用了+D,对应目录下的所有子目录和文件都会被列出
[root@hzz ~]# lsof +D /filepath/filepath2/

#对比使用+D选项,遍历查看某个目录的所有文件信息的方法
[root@hzz ~]# lsof | grep ‘/filepath/filepath2/’

#列出某个用户打开的文件信息,-u 选项,u其实是user的缩写
[root@hzz ~]# lsof -u username

#列出某个程序所打开的文件信息,-c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成 lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符
[root@hzz ~]# lsof -c mysql

#列出多个程序多打开的文件信息
[root@hzz ~]# lsof -c mysql -c apache

#列出某个用户以及某个程序所打开的文件信息
[root@hzz ~]# lsof -u test -c mysql

#列出除了某个用户外的被打开的文件信息,^这个符号在用户名之前,将会把是root用户打开的进程不让显示
[root@hzz ~]# lsof -u ^root

#通过某个进程号显示该进行打开的文件
[root@hzz ~]# lsof -p 1

#列出多个进程号对应的文件信息
[root@hzz ~]# lsof -p 123,456,789

#列出除了某个进程号,其他进程号所打开的文件信息
[root@hzz ~]# lsof -p ^1

#列出所有的网络连接
[root@hzz ~]# lsof -i

#列出所有tcp 网络连接信息
[root@hzz ~]# lsof  -i tcp

#列出所有udp网络连接信息
[root@hzz ~]# lsof  -i udp

#列出谁在使用某个端口
[root@hzz ~]# lsof -i :3306

#列出谁在使用某个特定的udp端口
[root@hzz ~]# lsof -i udp:55

#列出谁在使用某个特定的tcp端口
[root@hzz ~]# lsof -i tcp:80

#列出某个用户的所有活跃的网络端口
[root@hzz ~]# lsof  -a -u test -i

#某个用户组所打开的文件信息
[root@hzz ~]# lsof -g 5555

利用lsof恢复删除的文件:

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数库的活动事务日志。有时可以通过lsof来恢复这些文件;当进程打开了某个文件,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的录索引节点。
在/proc目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。

#假如由于误操作将/var/log/messages文件删除掉了,那么这时需要将/var/log/messages文件恢复。

#首先使用lsof来查看当前是否有进程打开/var/logmessages文件

[root@hzz ~]# lsof |grep /var/log/messages 
COMMAND PID  USER FD TYPE DEVICE  SIZE     NODE   NAME
syslogd 1283 root 2w REG   3,3   5381017 1773647  /var/log/messages (deleted)

#从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。

#因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息。

[root@hzz ~]# head -n 10 /proc/1283/fd/2

  Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
  Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
  Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (rooteverestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
  Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
  Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)

3、进程管理

3.1 发送信号管理进程

Linux系统中使用发送信号的方式来管理进程,系统可以识别的信号较多,我们可以使用命令“kill -l“来查询。

kill命令可以发送信号来管理进程。

[root@hzz ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
  • 主要的信号
信号代号 信号名称 含义
1SIGHUP该信号让进程立即关闭,然后重新读取配置文件之后重启
2SIGINT程序终止信号,用于终止前台进程。相当于输出 ctrl+c 快捷键
9SIGKILL用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。一般用于强制终止进程
15SIGTERM正常结束进程的信号,kill 命令的默认信号。有时如果进程已经发生问题,这个信号是无法正常终止进程的,我们才会尝试SIGKILL 信号,也就是信号 9
18SIGCONT该信号可以让暂停的进程恢复执行。本信号不能被阻断
19SIGSTOP该信号可以暂停前台进程,相当于输入 ctrl+z 快捷键。本信号不能被阻断

3.2 kill命令

使用信号管理进程。

#kill命令用法:
kill [-信号] PID

#使用kill -1 信号让PID为2246的进程重启。
[root@localhost ~]# kill -1 2246

#使用kill -19 信号,让vim进程暂停。
[root@localhost ~]# vi test.sh

#换一个不同的终端,查看下这个这个进程的状态。进程状态是 S(休眠)和+(位于后台),因为是在另外一个终端运行的命令所以显示后台。
[root@localhost ~]# ps aux | grep "vi" | grep -v "grep"
root 2313 0.0 0.2 7116 1544 pts/1 S+ 19:20 0:00 vi test.sh

#使用-19 信号,让 PID 是 2313 的进程暂停。相当于在 vi 界面按“ctrl+z”快捷键。
[root@localhost ~]# kill -19 2313

#注意 2313 进程的状态,变成了 T(暂停)状态。这时我切换回 vi 的终端,发现 vi 命令已经暂停,又回到了命令提示符。
[root@localhost ~]# ps aux | grep "vi" | grep -v "grep"
root 2313 0.0 0.2 7116 1580 pts/1 T 19:20 0:00 vi test.sh

#不过 2313 进程就会卡在后台,可以使用“kill -9 2313”强制终止进程.

3.3 killall命令

killall后面加进程名,表示将匹配到的以进程名为名的进程全部杀死。

[root@localhost ~]# killall [选项][信号] 进程名

选项:
-i: 交互式,询问是否要杀死某个进程
-I: 忽略进程名的大小写

#杀死进程名为sleep的所有进程
[root@localhost ~]# ps -ef|grep sleep
root 1914 1272 0 19:58 pts/0 00:00:00 sleep 1000
root 1915 1272 0 19:58 pts/0 00:00:00 sleep 500
root 1916 1272 0 19:58 pts/0 00:00:00 sleep 700
root 1920 1272 0 19:58 pts/0 00:00:00 grep --color=auto sleep
[root@localhost ~]# killall sleep
[1] Terminated sleep 1000
[2]- Terminated sleep 500
[3]+ Terminated sleep 700
[root@localhost ~]# ps -ef|grep sleep
root 1923 1272 0 19:58 pts/0 00:00:00 grep --color=auto sleep

4、工作管理

前台进程:是指当前正在使用的程序,用户可以进行操作;会占用当前的终端命令行界面。
后台进程:是指由计算机自动控制,可以自行运行的程序;用户只能关闭和开启后台进程。

4.1 & 命令

在命令的最后使用 & 符号可以将命令(程序)放入后台执行,执行完毕之后会显示结果; & 符号与前面的命令(程序)必须要用空格隔开。

注意:

  • 放入后台执行的命令(程序)不能与前台有交互,否则这个命令(程序)是不能在后台执行的。
  • 当用户断开终端后,& 放入后台运行的命令(程序)就会终止。

ctrl+z 也可将命令(程序)放入后台,但是 ctrl+z 放入后台的命令(程序)处于暂停状态。

[root@localhost ~]# sleep 5s &
[1] 1819
[root@localhost ~]#
[root@localhost ~]#
[1]-  完成                  sleep 5s

[1]    方括号括起来的为工作号也叫作业号
1819   为进程号(PID)

#工作号(作业号)是用户主动将进程放入后台之后产生的,一般用"[数字]"形式表示。
#工作号(作业号)的作用是方便用户管理后台运行的程序。

4.2 jobs命令

jobs命令可以查看放入后台执行的命令(程序)。只能看到用户主动放入后台执行的命令(程序)。

jobs
选项:
    -l 显示后台工作的命令(程序)的PID

[root@hzz ~]# sleep 500s &
[1] 105906
[root@hzz ~]# sleep 100s &
[2] 105961
[root@hzz ~]# sleep 300s &
[3] 106030
[root@hzz ~]# jobs
[1]   运行中               sleep 500s &
[2]-  运行中               sleep 100s &
[3]+  运行中               sleep 300s &
[root@hzz ~]# jobs -l
[1]- 105906 运行中               sleep 500s &
[3]+ 106030 运行中               sleep 300s &
[root@hzz ~]#

4.3 fg命令

fg命令可以将后台的工作恢复到前台运行。

fg %工作号
参数:
%工作号          %号可以省略,但是注意工作号和 PID 的区别。

[root@hzz ~]# sleep 500s &
[1] 117170
[root@hzz ~]# fg %1
sleep 500s

4.4 bg命令

bg命令可以恢复后台暂停的工作,让其在后台继续运行。

bg %工作号
参数:
%工作号          %号可以省略,但是注意工作号和 PID 的区别。

[root@hzz ~]# sleep 500s
^Z
[1]+  已停止               sleep 500s
[root@hzz ~]# bg %1
[1]+ sleep 500s &
[root@hzz ~]# jobs
[1]+  运行中               sleep 500s &
[root@hzz ~]# 

4.5 nohup命令

nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确的在后台执行;和 &一起使用。

注意:使用nuhup命令放入后台运行的命令(程序)一但断开终端,用 jobs 命令就查看不到,需要用 ps 或 top 命令查看。

nohup 命令 &
#nohup 和 & 中间加上命令,表示将命令放入后台运行,断开终端也不会终止。

[root@hzz ~]# nohup sleep 500s &
[1] 46544
[root@hzz ~]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@hzz ~]# ps -ef | grep "sleep 500s" | grep -v "color"
root      46544  35267  0 19:15 pts/0    00:00:00 sleep 500s
[root@hzz ~]# 

4.6 screen命令

screen是工作中非常推荐使用的将命令放入后台运行的工具;它的作用是可以新开会话然后将会话以及会话中执行的命令放入后台运行,并且可以随时进行会话切换;哪怕终端断开会话也不会终止。

screen命令选项:

-S <会话名称>		//新开一个会话并指定该会话的名称 
Ctrl + a + d		//此快捷键可以切换回终端,会话会被放入后台运行
-ls			//显示所有的放入后台的终端
-r <会话名称或id>	//进入指定的会话
Ctrl + d		//此快捷键可以终止会话

演示示例:

//新开一个名为ping的会话
[root@hzz ~]# screen -S ping

//在此会话中ping百度,然后使用快捷键 Ctrl + a + d 将此会话放入后台
[root@hzz ~]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=53 time=12.7 ms

//查看放入后台的会话
[root@hzz ~]# screen -ls
There is a screen on:
        346898.ping     (Detached)
1 Socket in /run/screen/S-root.

//进入放入后台的会话
[root@hzz ~]# screen -r ping

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值