RHCE9学习指南 第17章 进程管理

在这里插入图片描述

17.1 进程介绍

在Windows下打开任务管理器就可以查看到系统所有进程,如图17-1所示。
file
图17-1 Windows下的任务管理器
这里列出了系统中所有的进程。不过也可以使用命令行工具来查看进程。每个进程都会有一个process ID,简称为pid。

17.2 查看进程

也可以使用ps命令来查看系统中的进程,当执行不加任何选项的ps时显示的是当前终端的进程,命令如下。

[root@server ~]# psPID TTY        TIME CMD11667 pts/1      00:00:00 bash51848 pts/1      00:00:00 ps
[root@server ~]#

使用ps查看当前终端进程如图17-2所示。
file
图17-2 查看当前终端的进程
有很多进程不属于任何终端,这些进程都是后台进程。如上图,在终端1上运行了A,B两个进程,当在终端1上执行ps命令时只能看到终端1上的三个进程(包括ps本身),看不到其他终端及后台进程。如果想查看系统所有进程,就需要加上选项了。

基本上不同版本的UNIX系统上都有自己的ps命令,但是这些命令却没有一个统一的选项约定,Linux中的ps命令尽可能地包括所有的这些选项以适应不同UNIX背景的人群。所以,Linux中ps包括了UNIX风格和Linux风格的选项,最常见的用法包括ps aux和ps -ef。

ps aux 可以列出系统中所有的进程,如图17-3所示。
file
图17-3 通过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浏览器,如图17-4所示。
file
图17-4 打开一个firefox浏览器
如果要查看某进程的pid可以结合grep一起来使用,例如,查看Firefox的pid,命令如下。

[root@server ~]# ps aux | grep firefox
lduan      53797  ..../usr/lib64/firefox/firefox
lduan      53878  ....childID 1 ... /usr/lib64/firefox/browser 53797 tab
lduan      53963  ...-childID 4 ... /usr/lib64/firefox/browser 53797 tab
lduan      53996  ...-childID 5 ... /usr/lib64/firefox/browser 53797 tab
lduan      54250  ...-childID 7 ... /usr/lib64/firefox/browser 53797 tab
root       55877  0.0  0.0  12348  1148 pts/1    S+   18:30   0:00 grep --color=auto firefox
[root@server ~]# 

在执行此命令时grep命令中也含有firefox关键字,所以也找出来了,明显grep那行并不是我们想要的,所以一般可以再加上grep -v grep过滤,命令如下。

[root@server ~]# ps aux | grep -v grep | grep firefox 
lduan      53797  ..../usr/lib64/firefox/firefox
lduan      53878  ....childID 1 ... /usr/lib64/firefox/browser 53797 tab
lduan      53963  ...-childID 4 ... /usr/lib64/firefox/browser 53797 tab
lduan      53996  ...-childID 5 ... /usr/lib64/firefox/browser 53797 tab
lduan      54250  ...-childID 7 ... /usr/lib64/firefox/browser 53797 tab
[root@server ~]# 

这里可以看到,firefox的主进程的PID是53797,其他几个是对应的子进程。
找出某进程的pid除使用如上的方法外,还可以使用pgrep命令,用法如下。
pgrep 名称
例如,现在要查看firefox的PID,命令如下。

[root@server ~]# pgrep firefox
53797
[root@server ~]#

这里只查看到了firefox主进程的PID,如果要看到每个子进程的PID,需要加-f选项,命令如下。

[root@server ~]# pgrep -f firefox
53797
53878
53963
53996
54250
[root@server ~]#

除了pgrep也可以使用pidof,命令如下。

[root@server ~]# pidof firefox
54250 53996 53963 53878 53797
[root@server ~]#

pidof和pgrep的区别在于,pidof必须要跟上完整的名称,pgrep则不需要,命令如下。

[root@server ~]# pgrep -f firefo
53797
53878
53963
53996
54250
[root@server ~]# pidof firefo
[root@server ~]# 

pgrep会把进程COMMAND中含有firefo的进程的PID全部找出来,pidof找的是COMMAND是firefo的。

对于ps来说,查看的是执行命令那一瞬间的情况,如果想动态的查看进程则可以使用top命令。默认情况下top每隔3s更新一次,可以用-d来指定更新间隔,例如,1秒更新一次可以用top -d 1 指定,如图17-5所示。
file
图17-5 使用top -d 1查看进程的结果
按q退出。

17.3 发送信号

有时可能要关闭进程,单击右上角的“关闭”按钮就可以关闭正在运行的程序,不过有时这种方式是关闭不了,如图17-6所示。
file
图17-6 Windows下关不掉程序的情况

此时单击“关闭程序”选项,强制关闭此程序。

关闭一个正在运行的程序时,本质上是系统给此程序对应的进程发送一个关闭信号。不同的关闭方式,信号是不一样的,查看系统有多少信号可以用kill -l进行查看,如图17-7所示。
file
图17-7 所有能用的信号

也可以用kill命令手动给进程发送信号,这里介绍3个常用的信号,15号信号、9号信号和2号信号。
15号信号,当单击右上角“关闭”按钮去关闭一个程序时,系统发送的就是15号信号,这也是默认信号,在命令行用kill命令时如果不指定信号则是15号。
在后台运行sleep命令,同时也显示了进程的pid,如下所示。

[root@server ~]# sleep 1000 &
[1] 56227
[root@server ~]#

这里可以看到,sleep进程的PID是56227,下面给这个进程发送一个9号信号,命令如下。

[root@server ~]# kill 56227
[root@server ~]# 
[1]+  已终止               sleep 1000
[root@server ~]#

2号信号,当我们按【Ctrl +C】组合键时,本质上就是发送了一个2号信号。运行sleep命令,后面没加 &就是放在前台运行,命令如下。

[root@server ~]# sleep 1000
^C
[root@server ~]#

按【Ctrl+C】组合键会终止正在运行的程序即对对应的进程发送了2号信号。
再次运行sleep命令,并把它放在后台运行,命令如下。

[root@server ~]# sleep 1000 &
[1] 56230
[root@server ~]#

这里sleep进程的PID是56230,给这个进程发送一个2号信号,命令如下。

[root@server ~]# kill -2 56230
[root@server ~]# 
[1]+  中断                  sleep 1000
[root@server ~]#

当一个程序关闭不掉时,需要强制关闭,此时可以对进程发送9号信号,命令如下。

[root@server ~]# sleep 1000 &
[1] 56241
[root@server ~]# kill -9 56241
[root@server ~]# 
[1]+  已杀死               sleep 1000
[root@server ~]#

这样就强制关闭了。
使用kill命令后面需要跟上进程的PID,这里还需要查找出进程的PID,如果想直接杀死某个运行的程序,则可以使用killall命令。先在后台运行几个程序。

[root@server ~]# sleep 1000 &
[1] 56258
[root@server ~]# sleep 1000 &
[2] 56259
[root@server ~]# sleep 1000 &
[3] 56260
[root@server ~]# sleep 1000 &
[4] 56261
[root@server ~]#

这里要杀死所有sleep所对应的进程,命令如下。

[root@server ~]# killall -9 sleep 
[1]   已杀死               sleep 1000
[2]   已杀死               sleep 1000
[3]-  已杀死               sleep 1000
[4]+  已杀死               sleep 1000
[root@server ~]# 

17.4 进程优先级

系统中所有的进程都要消耗CPU的资源,CPU会为每个进程分配一个时间片,轮到某进程了则CPU会处理这个进程的请求,时间片到期,则会把进程暂停放回队列等待下一轮的时间片。在同一颗CPU上如果运行了太多的程序就会导致CPU的资源不够,可以调整进程的优先级,让指定进程获取更多的资源,更优先地去执行。

好比在驾校学车时,教练车就是CPU资源,每个学员就是一个个等待的进程。每个学员上车练习10分(时间片),10分钟过了之后就要下车让下一个学员上车练习,再次练习需要等待下一轮。如果学员太多等待的时间就会很久,如果想多练习一些,可以让教练设置下优先级,别人练习一次10分钟,我练习一次2小时即可。

进程的优先级有两个值决定:优先顺序(priority)和优先级(niceness),其中优先顺序由内核对它进行动态的更改我们不需要做太多干预,对用户而言,只需要通过nice来修改即可。nice值的取值范围在-20~19,nice的值越小进程就越优先执行。

多个进程如果运行在不同的CPU上是互不干扰的,不会发生抢资源的情况,进程只有运行在同一颗CPU上才会发生资源的抢占。所以,做实验时要确保多个进程是运行在同一颗CPU上的,首先查看一下CPU的情况,命令如下。

[root@server ~]# lscpu 
架构:           x86_64
CPU 运行模式:  32-bit, 64-bit
字节序:         Little Endian
CPU:             2
在线 CPU 列表:  0,1
每个核的线程数: 1
...
[root@server ~]# 

可以看到,现在有两颗CPU(一颗CPU两个核认为是2颗CPU)编号分别是0和1,现在关闭1号CPU,命令如下。

[root@server ~]# echo 0 > /sys/devices/system/cpu/cpu1/online 
[root@server ~]# lscpu 
架构:           x86_64
CPU 运行模式:   32-bit, 64-bit
字节序:         Little Endian
CPU:              2
在线 CPU 列表:  0
离线 CPU 列表:  1
每个核的线程数: 1...输出...
[root@server ~]# 

这样就可以看到1号CPU已经离线了,注意/sys/devices/system/cpu/cpu1/online中的值如果是0则表示CPU离线,如果是1则表示CPU在线。
下面运行两个cat进程,命令如下。

[root@server ~]# cat /dev/zero > /dev/null &
[1] 56550
[root@server ~]# cat /dev/zero > /dev/null &
[2] 56551
[root@server ~]#

然后再打开一个终端用top 进行查看,结果如图17-8所示。
file
图17-8 两个cat的CPU的消耗基本差不多
可以看到,两个cat进程消耗的CPU是差不多的,因为他们nice值相同,可以平等的消耗CPU资源。下面使用renice修改进程56550的nice值,改为-10,命令如下。

[root@server ~]# renice -n -10 56550
56550 (process ID) 旧优先级为 0,新优先级为 -10
[root@server ~]#

这样进程56550进程会比56551占用更多的CPU资源,再次到top中查看,结果如图17-9所示。
file
图17-9 一个cat被改变了优先级
可以看到,56550占用的资源比56551多了很多。
刚才讲nice越小越可得到更多CPU资源,越大越不容易抢到资源,这里改成最大值19,命令如下。

[root@server ~]# renice -n 19 56550
56550 (process ID) 旧优先级为 -10,新优先级为 19
[root@server ~]#

然后再到top中查看,结果如图17-10所示。
file
图17-10 一个cat被改变了优先级
可以看到,56550只获取到了很少的CPU资源。

关闭cat进程,命令如下。

[root@server ~]# killall -9 cat
[root@server ~]# 
[1]-  已杀死               cat /dev/zero > /dev/null
[2]+  已杀死               cat /dev/zero > /dev/null
[root@server ~]

刚才是在程序运行起来之后再使用renice修改的nice值,也可以直接以某个特定的nice启动进程,只要在运行的命令前面加上nice -n 优先级即可,命令如下。

[root@server ~]# nice -n 10 cat /dev/zero > /dev/null &
[1] 56613
[root@server ~]#

关闭这个cat进程,命令如下。

[root@server ~]# killall -9 cat
[root@server ~]# 
[1]+  已杀死               nice -n 10 cat /dev/zero > /dev/null
[root@server ~]#

开启1号CPU,命令如下。

[root@server ~]# echo 1 > /sys/devices/system/cpu/cpu1/online 
[root@server ~]# 

作业

  1. 下面哪个命令能查出Firefox的pid?
    a. pgrep firefo
    b. pidof firefo
    c. ps aux | grep -v firefox
    d. ps aux | grep firefox

2.下面哪个命令可以把pid=1000的进程杀死?
a. kill
b. killall

3.假设系统中存在firefox进程,请用一条命令杀死firefox进程。

方法1______________________________

方法2______________________________

4.现在Firefox在系统中运行,请写出三种方法查询Firefox pid的命令。

方法1____________________________

方法2____________________________

方法3____________________________

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用Unity3D Log打印工具XDebug

特点 显示时间,精确到毫秒显示当前帧数(在主线程中的打印才有意义,非主线程显示为-1)有三种条件编译符(如下图) 注:要能显示线程中的当前帧数,要在app启动时,初始化mainThreadID字段条件编译符…

uniapp日期加减切换,点击切换

先上完成后的页面&#xff1a;当前年年份不显示&#xff0c;不然完整显示。 可以切换和自定义选择。 html:样式和图片自定义。 <view class"image-text_30"><image click"delMonth" :src"require(/static/home/zuo.png)" class"…

翻译:Building Efficient RAG Systems: A Deep Dive into devv.ai

RAG 的全称是&#xff1a;Retrieval Augmented Generation&#xff08;检索增强生成&#xff09; 最初来源于 2020 年 Facebook 的一篇论文&#xff1a;Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks&#xff08;是的&#xff0c;你没有看错&#xff0c;…

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 【原创】CPO-VMD【24年新算法…

计算机毕业设计----ssm在线选课管理系统

项目介绍 一个简单的“在线教学平台系统”&#xff0c;实现基本的选课功能。 主要功能&#xff1a; 管理员能够实现学生基本信息的录入、修改、删除等操作&#xff0c;其中学生信息包括学号、姓名、性别、专业等信息&#xff1b; 管理员能够实现课程的录入、修改、删除等功能&…

详解java多态

目录 一、多态的概念 二、多态实现条件 三、重写 3.1重写概念 3.2重写规则 3.3重载和重写的区别&#xff1f;&#xff08;面试重点&#xff09; 四、静态绑定和动态绑定 五、 向上转移和向下转型 5.1 向上转型 5.2 向下转型 六、多态的优缺点 6.1使用多态的好处 6…

微信扫码进入小程序特定页面

小程序配置 开发 - 开发管理 - 开发设置-普通链接二维码打开小程序 配置好的截图 如下&#xff1a;二维码规则建议是自己的域名 /mini/ 功能页面 pages/index/index 是为了方便跳转其他页面 记得把校验文件发给后端 web 端处理 二维码格式为&#xff1a;二维码规则/功能页…

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…

Oracle之 第三篇 PL/SQL基础

目录 Oracle之 第三篇 PL/SQL基础 PL/SQL程序块 PL/SQL语言 PL/SQL的基本结构 PL/SQL块分类 一、PL/SQL语言 二、PL/SQL 常量 、变量 合法字符 数据类型 LOB 数据类型 属性类型 运算符 常量 PL/SQL常量 1 、变量的声明 2、属性类型 % type 变量赋值 %type…

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table&#xff0c;协议中根据SCS规定的传输带宽和可以配置的RB 数如上表&#xff0c;也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置&#xff0c;举例如下。 如上图分别是几种带宽的配置参数&…

Matlab绘制双纵轴图(yyaxis函数)

一、方法一yyaxis函数 x linspace(0,pi); y1 cos(x); yyaxis left; % 激活左边的轴 plot(x,y1) xlabel(X-axis); ylabel(left Y-axis); % 给左y轴添加轴标签hold on yyaxis right; % 激活右边的轴 y2 cos(2*x); plot(x,y2) ylim([-1,1]); % 设置右y轴的界限 ylabel(right Y…

【前端】前后端的网络通信基础操作(原生ajax, axios, fetch)

概述 前后端网络请求工具 原生ajaxfetch apiaxios GET和POST请求 get只能发纯文本 post可以发不同类型的数据&#xff0c;要设置请求头&#xff0c;需要告诉服务器一些额外信息 测试服务器地址 有一些公共的测试 API 可供学习和测试用途。这些 API 允许你发送 HTTP 请求…

24年全国31省份教师资格笔试报名时间汇总报名材料❗

✅教资报考必备材料&#xff1a;个人证件照、个人证件照材料、个人证件照。 &#x1f550;全国各地区报名时间汇总&#xff1a; 北京 1月12日-15日15:00 广东 1月12日9:30至15日16:00 山东 1月12日-15日15:00 江苏 1月12日-15日12:00 吉林 1月12日-15日16:00 四川 1月12日-15日…

私域新手必看:这可能是你最快速的入门指南!

一、认知层&#xff1a;为什么必须做私域&#xff1f; 了解这个问题&#xff0c;必须得观察一下中国现状。根据中国互联网络信息中心&#xff08;CNNIC&#xff09;发布第48次《中国互联网络发展状况统计报告》显示&#xff0c;截至 2021 年 6 月&#xff1a; 而典型电商平台的…

电口模块SFP-GE-T常见问题解答

电口模块SFP-GE-T是一种常见的网络设备&#xff0c;用于实现光电信号的转换。在使用电口模块SFP-GE-T的过程中&#xff0c;可能会遇到一些问题。本文将为您解答一些常见问题&#xff0c;并提供一些使用技巧。 一、电口模块SFP-GE-T怎么用&#xff1f; 使用电口模块SFP-GE-T的…

【手搓深度学习算法】用逻辑回归分类双月牙数据集-非线性数据篇

用逻辑回归分类-非线性数据篇 前言 逻辑斯蒂回归是一种广泛使用的分类方法&#xff0c;它是基于条件概率密度函数的最大似然估计的。它的主要思想是将输入空间划分为多个子空间&#xff0c;每个子空间对应一个类别。在每个子空间内部&#xff0c;我们假设输入变量的取值与类别…

2024年寒假即将来临 如何实现高质量亲子陪伴?

近日,各地陆续公布了寒假放假时间安排,孩子们期待着迎来一个休闲和轻松的假期。然而,对于许多家长来说,他们也意识到寒假不仅是一个放松的时间,更是一个增进亲子关系的宝贵机会,可以为孩子提供有意义的学习陪伴。 自“双减”政策落地后,学生的课业负担减轻许多,拥有了更多的空余…

【leetcode 2707. 字符串中的额外字符】动态规划 字典树

2707. 字符串中的额外字符 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割…

Go 如何处理死锁以提供哪些工具来检测或防死锁?

并发是 Go 的核心特性&#xff0c;它使程序能够同时处理多个任务。它是现代编程的一个强大组件&#xff0c;如果使用正确&#xff0c;可以产生高效、高性能的应用程序。然而&#xff0c;并发性也带来了顺序编程中不存在的某些类型错误的可能性&#xff0c;其中最臭名昭著的是死…

拼多多API的未来:无限可能性和创新空间

拼多多&#xff0c;作为中国电商市场的巨头之一&#xff0c;自成立以来一直保持着高速的发展态势。其API的开放为开发者提供了无限的可能性和创新空间&#xff0c;使得更多的商业逻辑和功能得以实现。本文将深入探讨拼多多API的未来发展&#xff0c;以及它所具备的无限可能性和…