Linux系统管理入门:进程管理

前言

在Linux系统中,进程管理是非常重要的一个方面。进程是程序运行的实例,它们动态产生、动态消亡,并且会继承执行用户的权限和父进程的属性信息。在Linux系统中,有许多工具可以用来管理和监控进程,例如ps、top、pgrep、pidof等。

本文将介绍进程管理的相关概念和工具,包括进程的概念、ps命令、top命令、pgrep命令、pidof命令、进程通信、信号发送工具、进程优先级、作业控制等内容。通过学习这些内容,读者可以更好地理解和掌握Linux系统中的进程管理,从而更好地管理和维护自己的Linux系统。

1、进程的概念

在计算机科学中,进程(Process)是指正在运行的程序的实例。它是计算机系统中的一个基本概念,用于描述正在执行的程序的状态。每个进程都是系统资源(如CPU、内存、文件系统等)的一个独立使用者,它在系统中拥有自己的地址空间、内存、文件描述符、堆栈等。

以下是一些进程的关键概念:

  1. 独立性: 每个进程是相互独立的实体,它们运行在各自的地址空间中,不会直接干扰彼此的执行。
  2. 并发执行: 操作系统通过在不同的时间点上切换进程的执行,实现了多个进程的并发执行。这使得在单个系统上能够同时运行多个程序。
  3. 资源分配: 每个进程都有自己的资源分配,包括内存空间、文件描述符、寄存器等。操作系统负责为进程分配和管理这些资源。
  4. 上下文切换: 当操作系统在不同的进程之间进行切换时,需要保存当前进程的执行状态,包括寄存器值、程序计数器等,然后加载新进程的状态。这个过程称为上下文切换。
  5. 通信机制: 进程之间可能需要进行通信,这可以通过进程间通信(IPC)机制来实现。常见的 IPC 方法包括管道、套接字、消息队列等。
  6. 状态: 一个进程可能处于运行、就绪、阻塞等不同的状态,取决于其当前的执行情况。
  7. 父子关系: 进程可以创建其他进程,从而形成父子关系。父进程通常可以监控和控制子进程。

在多任务操作系统中,进程是操作系统进行任务调度和资源管理的基本单位。每个进程都有自己的执行环境,包括代码、数据和系统资源,操作系统通过对进程的管理来实现多任务的并发执行。

重点

  • ①进程是一个程序运行的实例,进程是动态产生,动态消亡的。
  • ②进程会继承执行用户的权限,进程会继承父进程的属性信息,一个父进程可以有多个子进程

2、相关命令

2.1 ps命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ps      动态查看系统进程状态
-a 查看所有终端的进程
-u 打印进程所有者信息
-x 查看不属千任何终端的进程
-e 查看系统所有进程
-f 查看额外的信息
-o 指定格式输
-l 长格式显示更加详细的信息
--sort: 指定排序的参数
例如: ps -aux --sort=%cpu //按cpu排序,默认从小到大
ps -aux --sort=-%cpu //按进程所占cpu从大到小排序
ps -aux --sort=%mem //按mem排序,默认从小到大
ps -aux --sort=-%mem //按进程所占mem从大到小排序
常用组合: ps aux 或者ps -ef

PS命令回显解释:

TTY三种状态

  • pts: 是虚拟伪终端(一般ssh登录以及图形化su或者su -)
  • tty: 表示当前有桌面环境F1-F6
  • ?: 表示该进程没有终端,一般是内核进程

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看进程的PID、名称以及CPU 占用率
$ ps axo pid,comm,pcpu

# 按内存资源的使用量对进程进行排序
$ ps aux | sort -rnk 4

# 按 CPU 资源的使用量对进程进行排序
$ ps aux | sort -nk 3

# 显示所有进程信息,连同命令行
$ ps -ef

# ps 与grep 常用组合用法,查找特定进程
$ ps -ef | grep ssh

# 显示一个父进程的子进程
$ ps -o pid,uname,comm -C nginx

# 通过进程id获取服务名称
$ ps -o command -p 91730 | sed -n 2p

2.2 top命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
top     动态查看系统进程状态
-d 指定刷新间隔时间
-p 通过pid来监视某个进程的状态

交互式命令
1 查看cpu核数及其状态
c 显示完整的命令名称
d 指定刷新时间
s 指定刷新时间
k 杀死指定进程
f 自定义显示参数
M 根据内存占用从大到小排序
P 根据CPU占用从大到小排序
T 根据运行时间从大到小排序
m 内存利用率图形化显示
1 查看cpu1

参数含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
第1行:load average:1,5,15min的系统平均负载
以单核cpu为例,如果该值小于1,说明系统不繁忙有大量空闲资源
如果该值等于1,说明系统已经满载运行,依然可以处理
如果该值大于1,说明系统已经满载运行,但是有大量任务等待处理
第2行:total:总进程数,running:运行进程数,sleeping:休眠进程数,stopped:停止进程数,zombie:僵尸进程
僵尸进程会消耗系统资源,需要人为关闭
孤儿进程由PID为1的进程接管,接管以后负责释放这个进程
在RHEL7以前PID为1的进程是init,7以后是systemd
第3行
us:用户空间占用cpu百分比;
sy:内核空间占用cpu百分比;
ni:用户空间改变过优先级的进程占用cpu百分比。
id:空闲cpu占的百分比。
wa:等待输入输出占用cpu时间百分比。
hi:硬中断占用cpu时间百分比。
si:软中断占用cpu时间百分比。
st: 虚拟机CPU等待时间百分比,RHEL8以后才有
第4行:物理内存total:内存总容量,free:空闲容量,use:已使用容量,buff/cached:用于缓冲的内存数量,单位为M
第5行:cached Mem:用于缓冲的交换区总量
avail Mem:可分配的物理内存总量

进程状态

1
2
3
4
5
6
7
8
9
10
11
12
PID 进程id
USER 进程所有者
PR 进程优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 进程名称(命令名/命令行)

2.3 pgrep命令

根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID(PID),模糊查找,只要满足进程名的部分即可。

语法

1
pgrep(选项)(参数)

选项

1
2
3
4
5
6
7
8
pgrep   通过进程的名字查看其PID(模糊匹配程序名)
-U 查看某个用户的进程PID
-G 查看某个组的进程PID
-P 根据父进程PID,查询其子进程PID
-l 打印进程PID的同时打印进程名
-o 若某个程序有多个进程时,查看最早启动的进程PID
-n 若某个程序有多个进程时,查看最后启动的进程PID
-d 指定分隔符,默认为换行符

参数

进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。

示例

1
2
$ pgrep -lo httpd
4557 httpd

2.4 pidof命令

pidof 通过进程的名字查看其PID(精确匹配进程名,必须和进程名一模一样)
用来判断服务是否运行

语法

1
pidof(选项)(参数)

选项

1
2
3
4
-s:仅返回一个进程号;
-c:仅显示具有相同“root”目录的进程;
-x:显示由脚本开启的进程;
-o:指定不显示的进程ID。

参数

进程名称:指定要查找的进程名称。

示例

1
2
3
4
5
$ pidof nginx
13312 5371

$ pidof crond
1509

2.5 进程通信

进程通信的方式:信号、有名管道、消息队列、套接字scoket(网络套接字)
Linux中默认使用信号来进行进程的通信,每个进程在收到信号之前,都是先运行自己的代码,收到信号后优先处理信号,系统中一共有64种信号;

常用信号

1
2
3
4
5
6
7
8
Signal 1 SIGHUP 挂起进程、重新加载配置文件
Signal 2 SIGINT 终止进程 Ctrl+C
Signal 3 SIGQUIT 终止进程,生成core文件
Signal 9 SIGKILL 无条件终止进程,强制结束进程,生产环境慎用
Signal 15 SIGTERM 尽可能终止进程
Signal 18 SIGCONT 继续运行一个停止进程
Signal 19 SIGSTOP 非终端传来的停止信号
Signal 20 SIGTSTP 终端传来的停止信号 Ctrl+Z

2.6 信号发送工具

1
2
3
4
5
kill -[signal] PID 发送信号

killall -[signal] comm 发送信息(批量结束一类进程,精确匹配进程名)

pkill -t pts/0 将远程登录的用户踢下线。远程自己不能pkill自己

2.6.1 kill命令

发送信号到进程。

主要用途

  • 发送信号到作业或进程(可以为多个)。
  • 列出信号。

选项

1
2
3
4
-s sig    信号名称。
-n sig 信号名称对应的数字。
-l 列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。
-L 等价于-l选项。

参数

pid:进程ID

jobspec:作业标识符

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 列出所有信号名称:
[user2@pc] 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

# 下面是常用的信号。
# 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。

HUP 1 终端挂断
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
KILL 9 强制终止
TERM 15 终止
CONT 18 继续(与STOP相反,fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

# 以下发送KILL信号的形式等价。当然还有更多的等价形式,在此不一一列举了。
[user2@pc] kill -s SIGKILL PID
[user2@pc] kill -s KILL PID
[user2@pc] kill -n 9 PID
[user2@pc] kill -9 PID

2.6.2 killall命令

使用进程的名称来杀死一组进程。

语法

1
killall(选项)(参数)

选项

1
2
3
4
5
6
7
8
9
-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。

参数

进程名称:指定要杀死的进程名称。

示例

1
2
3
4
5
6
7
8
9
# 杀死所有同名进程
$ killall vi

# 指定向进程发送的信号
$ killall -9 vi

# 0信号表示不向进程发送信号, 可通过返回值判断进程是否存在, 0(存在)1(不存在)
$ killall -0 vi
echo $?

2.6.3 pkill命令

可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。

语法

1
pkill(选项)(参数)

选项

1
2
3
4
5
-o:仅向找到的最小(起始)进程号发送信号;
-n:仅向找到的最大(结束)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端。

参数

进程名称:指定要查找的进程名称,同时也支持类似grep指令中的匹配模式。

示例

1
2
3
4
$ pgrep -l gaim
2979 gaim

$ pkill gaim

也就是说:kill对应的是PID,pkill对应的是进程名称。

2.7 进程优先级

  • ①进程的优先级:优先级高的进程有优先执行的权力;进程的优先级由动态优先级(PR)和静态优先级(NI)决定;
  • ②在原来使用01调度的Linux上,会把nice(NI)值叫做静态优先级,由用户负责调整;priority(PR)的值在之前内核的01调度器上表现是会变化的,有内核负责调整,所以也叫动态优先级;
  • ③Linux进程可以分成两类:实时进程、非实时进程;

实时进程的优先级在0-99范围,非实时进程的优先级在100-139范围;

PRI值越小越早被执行,结合nice值后PRI变为:PRI(new)=PRI(old)+nice

注:目前的内核不再存储nice值。取而代之的是static_prio(静态优先级)。nice值用户可见,动态优先级则隐藏在内核中,nice值和静态优先级可通过一定的关系进程转换。所以说nice值只是影响了静态优先级。

  • 调度优先级决定对cpu的访问
  • 进程的nice值影响优先级
  • 值范围为-20到19,缺省为0
    • 低nice值意味着高cpu优先级
  • NICE值只有root可以降低(root才可以调整进程的优先级)

通过ps -o comm,nice查看

调整方式

  • 在进程启动时指定优先级: nice -n -20 程序(命令)
  • 调整已经存在的进程的优先级: renice -n -20 程序(命令)

2.8 作业控制

1
2
3
4
5
6
7
8
9
10
11
& 在命令结尾加上&符号,将该命令放后台运行

Ctrl+z 将当前正在运行的程序放至后台暂停,发送Signal 19信号

jobs 查看后台任务

bg [%jobnum] 将已暂停的进程在后台恢复

fg [%jobnum] 将已暂停的进程在前台恢复

kill -signal [%jobnum] 给后台进程发送信号(killall、pkill不支持该方式)

进程管理是Linux系统管理员必须掌握的重要技能之一。掌握进程管理的相关知识和工具,可以帮助管理员更好地监控和管理系统资源,提高系统的稳定性和性能。

本文提供的命令选项仅包含常用选项,而非所有选项。你可以通过在命令行中输入 命令 --help 来查看所有可用选项。


Linux系统管理入门:进程管理
https://www.zhoumx.net/Linux系统管理入门:进程管理.html
作者
阿星
发布于
2023年12月10日
许可协议