Linux 进程管理

Strong 2020年03月26日 501次浏览

进程管理

1、进程管理简介

1.1 什么是进程?

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

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

1.2 什么是程序?

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

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

1.3 进程管理的作用

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

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

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

2、进程的查看

2.1 ps命令

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

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

注意:

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

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

选项:
a:	显示一个终端的所有进程,除了会话引线
u:	显示进程的归属用户及内存的使用情况
x:	显示没有控制终端的进程

-e      //显示所有进程,与-A效果相同
-l      //以长格式显示
-F      //显示更详细的完整格式的进程信息
-f      //显示更详细的完整格式的进程信息
-H      //以进程层级格式显示进程相关信息
-o      //根据自己的需要选择要显示的字段

[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停止状态,可能是在后台暂停或进程在出错状态
W内存交互状态(从 2.6 内核开始无效)
X死掉的进程(应该不会出现)
Z僵尸进程。进程已经终止,但是部分程序还在内存当中。
<高优先级(以下状态在 BSD 格式当中出现)
N低优先级
L被锁入内存
s包含子进程
l多线程(小写 L)
  • | 位于后台

ps -le输出结果

[root@localhost ~]# ps -le
F S  UID  PID  PPID C PRI NI ADDR   SZ WCHAN  TTY	    TIME   CMD
4 S	   0	1	  0 0  80  0    -  718     -	?	00:00:02   init
1 S	   0	2	  0 0  80  0    -	 0     -	?	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该进程是否运行。“-”代表正在运行
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
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 命令,并不能看到系统中所有的进程,默认看到的只是 CPU 占比靠前的
进程。如果我们想要看到所有的进程可以把 top 命令的结果重定向到文件当中即可。不过 top 命令是
持续运行的,这时就需要“-b”和“-n”选项了,具体命令如下:

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

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 占比。

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
  • 主要的信号
信号代号信号名称含义
       1       SIGHUP该信号让进程立即关闭,然后重新读取配置文件之后重启
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 ~]# 

5、如何查看cpu核心数

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

[root@hzz ~]# grep 'model name' /proc/cpuinfo
model name      : Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz

#查询结果有几行,cpu就有几核。