Linux进程管理
本章主要介绍RHEL8中如何管理并查看进程。
????????了解进程并查看系统中存放的进程
????????了解进程的信号 ???????
????????进程优先级设置
1 进程介绍
????????在 Windows中打开任务管理器就可以查看到系统中的所有进程,如图所示。
????????这里列出了系统中所有的进程,不过也可以使用命令行工具来查看进程。每个进程都会有一个 Process ID,简称为PID。
2 查看进程
????????也可以使用ps命令来查看系统中的进程,当执行不加任何选项的ps命令时,显示的是当前终端的进程,命令如下。
[root@redhat8 ~]# ps
PID TTY TIME CMD
2164 pts/0 00:00:00 bash
3792 pts/0 00:00:00 ps
使用ps命令查看当前终端的进程,如图所示
????????有很多进程不属于任何终端,这些进程都是后台进程。如图上所示,在终端1中运行了A、B两个进程,当在终端1中执行ps命令时只能看到终端1上的三个进程(包括ps本身),看不到其他终端及后台进程。如果想查看系统中的所有进程,就需要加上选项了。?
????????基本上不同版本的UNIX系统上都有自己的ps命令,但是这些命令却没有一个统一的选项约定,Linux中的ps命令应尽可能地包括所有的这些选项以适应不同UNIX背景的人群。所以,Linux中 ps包括了UNIX风格和Linux风格的选项,最常见的用法包括ps aux 和 ps -ef。
????????ps aux可以列出系统中所有的进程,如图所示。
????????因为ps aux显示内容太多,所以这里通过head只截取前11行,这里每列的含义如下。
????????(1)USER:进程所属用户。
????????(2)PID:进程ID。
????????(3)%CPU:进程占用CPU百分比。
????????(4)%MEM:进程占用内存百分比。
????????(5)VSZ:虚拟内存占用大小(单位:KB)。
????????(6) RSS:实际内存占用大小(单位:KB)。 ????????
????????(7)TTY:终端类型。
? ? ? ? (8)STAT:进程状态。
? ? ? ? (9)START:进程启动时刻。
???????(10)TIME:进程运行时长。
???????(11)COMMAND:启动进程的命令。
????????TTY一列如果是“?”,则说明是后台进程。
查看进程信息,先在系统中打开一个Firefox浏览器,如图所示
????????在执行此命令时,grep命令中也含有firefox关键字,所以也找出来了,明显 grep那行并不是我们想要的,一般可以再加上 grep -v grep过滤,命令如下。
?????????可以看到,Firefox主进程的PID是3009,其他几个是对应的子进程。 找出某进程的PID除使用以上方法外,还可以使用pgrep命令,用法如下。
pgrep 名称
????????例如,现在要查看Firefox的PID,命令如下。
[root@redhat8 ~]# pgrep firefox
3009
????????这里只查看到了Firefox主进程的PID,如果要看到每个子进程的PID,需要加上 -f 选项,命令如下。
[root@redhat8 ~]# pgrep -f firefox
3009
3168
3199
3289
3293
3426
????????除了pgrep,也可以使用pidof命令,命令如下。
[root@redhat8 ~]# pidof firefox
3426 3293 3289 3199 3168 3009
????????pidof和 pgrep的区别在于,pidof必须跟上完整的名称pgrep则不需要,命令如下。
[root@redhat8 ~]# pgrep -f firefo
3009
3168
3199
3289
3293
3426
????????pgrep会把进程COMMAND中含有firefo的进程的PID全部找出来,pidof找的是COMMAND为firefo的。
????????对于ps 来说,查看的是执行命令那一瞬间的情况,如果想动态地查看进程,则可以使用top命令。默认情况下,top每隔3秒更新一次,可以用-d选项来指定更新间隔,例如,1秒更新一次可以用top-d1指定,如图所示。???
?????
按【q】键退出。?
3 发送信号
????????有时可能要关闭进程,单击右上角的【关闭】按钮就可以 关闭正在运行的程序,不过有时这种方式是关闭不了的。
????????此时选择【关闭程序】选项,强制关闭此程序。
????????关团一个正在运行的程序时,本质上是系统给此程序对应的进程发送一个关闭信号。不同的关闭方式,信号是不一样的,查看系统有多少信号可以使用kill -l命令进行查看,如图所示。
?????????也可以使用kill命令手动给进程发送信号,这里介绍3个常用的信号:15号信号、9号信号 和2号信号。
????????15号信号,当单击右上角的【关闭】按钮去关闭一个程序时,系统发送的就是15号信 号,这也是默认信号。在命令行中使用kill命令时,如果不指定信号,则是15号信号。
????????在后台运行sleep命令,同时也显示了进程的PID,如下所示。
[root@redhat8 ~]# sleep 1000 &
[1] 4184
????????可以看到,sleep进程的PID是4184。下面给这个进程发送一个9号信号,命令如下。
[root@redhat8 ~]# kill 9 4184
[root@redhat8 ~]#
[1]+ 已终止 sleep 1000
?????????2号信号,当我们按【Ctrl+C】组合键时,本质上就是发送了一个2号信号。运行sleep命 令,后面没有加&就是放在前台运行,命令如下。
[root@redhat8 ~]# sleep 1000
^C
????????按【Ctrl+C】组合键会终止正在运行的程序,即对对应的进程发送2号信号。 再次运行sleep命令,并把它放在后台运行,命令如下。
[root@redhat8 ~]# sleep 1000 &
[1] 4215
????????这里sleep进程的PID是4215,给这个进程发送一个2号信号,命令如下。
[root@redhat8 ~]# kill -2 4215
[root@redhat8 ~]#
[1]+ 中断 sleep 1000
????????当一个程序关不掉时,需要强制关闭,此时可以对进程发送9号信号,命令如下。
[root@redhat8 ~]# sleep 1000 &
[1] 4248
[root@redhat8 ~]# kill -9 4248
[root@redhat8 ~]#
[1]+ 已杀死 sleep 1000
????????这样就强制关闭了。
????????使用kill命令后面需要跟上进程的PID,这里还需要查找出进程的PID,如果想直接杀死某个运行的程序,则可以使用killall命令。先在后台运行几个程序。
[root@redhat8 ~]# sleep 1000 &
[1] 4274
[root@redhat8 ~]# sleep 1000 &
[2] 4275
[root@redhat8 ~]# sleep 1000 &
[3] 4276
[root@redhat8 ~]# sleep 1000 &
[4] 4277
[root@redhat8 ~]# sleep 1000 &
[5] 4278
????????这里要杀死所有 sleep所对应的进程,命令如下。
[root@redhat8 ~]# killall -9 sleep
[1] 已杀死 sleep 1000
[2] 已杀死 sleep 1000
[4]- 已杀死 sleep 1000
[3]- 已杀死 sleep 1000
[5]+ 已杀死 sleep 1000
4 进程优先级
????????系统中所有的进程都要消耗CPU的资源,CPU 会为每个进程分配一个时间片,轮到某进程时CPU会处理这个进程的请求,时间片到期,则会把进程暂停放回队列等待下一轮的时间片。在同一颗CPU上如果运行了太多的程序就会导致CPU的资源不够,可以调整进程的优先级,让指定进程获取更多的资源,更优先地去执行。
????????好比在驾校学车时,教练车就是CPU资源,每个学员就是一个个等待的进程。每个学员上车练习10分钟(时间片),10分钟过了之后就要下车让下一个学员上车练习,再次练习需要等待下一轮。如果学员太多,等待的时间就会很久。如果想多练习一会,可以让教练设置一下优先级,别人练习一次10分钟,我练习一次2小时。? ? ?
????????进程的优先级由两个值决定:优先顺序(priority)和优先级(niceness))。其中优先顺序由内核对它进行动态地更改,我们不需要做太多干预,对用户而言,只需要通过nice来修改。nice值的取值范围是 -20~19 ,nice值越小,进程就越优先执行。
????????多个进程如果运行在不同的CPU上是互不干扰的,不会发生抢资源的情况,进程只有运行在同一颗CPU上才会发生资源抢占的情况。所以,做实验时要确保多个进程是运行在同一颗CPU上的。首先查看一下CPU 的情况,命令如下。
[root@redhat8 ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 2
在线 CPU 列表: 0,1
每个核的线程数: 1
????????可以看到,现在有两颗CPU(一颗CPU有两个核被认为是两颗CPU),编号分别是0和1.。现 在关闭1号CPU,命令如下。
[root@redhat8 ~]# echo 0 > /sys/devices/system/cpu/cpu1/online
[root@redhat8 ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 2
在线 CPU 列表: 0
离线 CPU 列表: 1
每个核的线程数: 1
????????这样就可以看到1号CPU已经离线了,注意/sys/devices/system/cpu/cpu1/online中的 值如果是0则表示CPU离线,如果是1则表示CPU在线。
????????下面运行两个cat进程,命令如下。
[root@redhat8 ~]# cat /dev/zero > /dev/null &
[1] 4347
[root@redhat8 ~]# cat /dev/zero > /dev/null &
[2] 4350
?然后再打开一个终端用 top进行查看,结果如图所示。
?????????可以看到,两个cat进程消耗的CPU是差不多的,因为它们的nice值相同,可以平等地消耗CPU资源。下面使用renice修改进程2272的nice值,改为-10,命令如下。
[root@redhat8 ~]# renice -n -10 4347
4347 (process ID) 旧优先级为 0,新优先级为 -10
????????这样进程4347会比进程4350占用更多的CPU资源,再次到top中查看,结果如图所示。
????????可以看到,4347占用的资源比4350多了很多。 刚才讲nice值越小越可得到更多的CPU资源,越大越不容易抢到资源,这里改成最大值19,命令如下。
[root@redhat8 ~]# renice -n 19 4347
4347 (process ID) 旧优先级为 -10,新优先级为 19
?然后再到 top中查看,结果如图所示。
可以看到,4347只获取到了很少的CPU资源。
关闭cat进程,命令如下。
[root@redhat8 ~]# killall -9 cat
[root@redhat8 ~]#
[1]- 已杀死 cat /dev/zero > /dev/null
[2]+ 已杀死 cat /dev/zero > /dev/null
????????刚才是在程序运行起来之后再使用renice修改的nice值,也可以直接以某个特定的nice启动进程,只要在运行的命令前面加上“nice -n 优先级”即可,命令如下。
[root@redhat8 ~]# nice -n 10 cat /dev/zero > /dev/null &
[1] 4512
关闭这个cat进程,命令如下。
[root@redhat8 ~]# killall -9 cat
[root@redhat8 ~]#
[1]+ 已杀死 nice -n 10 cat /dev/zero > /dev/null
开启1号CPU,命令如下。
[root@redhat8 ~]# echo 1 > /sys/devices/system/cpu/cpu1/noline
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!