Linux---进程管理

本章主要介绍RHEL8中如何管理并查看进程。

  • 了解进程并查看系统中存放的进程
  • 了解进程的信号
  • 进程优先级设置

进程介绍 

在 Windows中打开任务管理器就可以查看到系统中的所有进程,如图下图所示。

  这里列出了系统中所有的进程,不过也可以使用命令行工具来查看进程。每个进程都会有 一个 Process ID,简称为PID。 


查看进程 

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

[root@rhel03 ~]# ps
    PID TTY          TIME CMD
   1904 pts/0    00:00:00 bash
   3828 pts/0    00:00:00 ps
[root@rhel03 ~]#

使用ps命令查看当前终端的进程,如下图所示。

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

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

[root@rhel03 ~]# ps -aux | head
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 176156 14416 ?        Ss   05:54   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root           2  0.0  0.0      0     0 ?        S    05:54   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   05:54   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   05:54   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   05:54   0:00 [kworker/0:0H-events_highpri]
root           9  0.0  0.0      0     0 ?        I<   05:54   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    05:54   0:00 [ksoftirqd/0]
root          11  0.0  0.0      0     0 ?        R    05:54   0:00 [rcu_sched]
root          12  0.0  0.0      0     0 ?        S    05:54   0:00 [migration/0]
[root@rhel03 ~]# 

因为ps aux显示内容太多,所以这里通过head只截取前10行,这里每列的含义如下。 

  • USER:进程所属用户。 
  • PID:进程ID。
  • %CPU:进程占用CPU百分比。
  • %MEM:进程占用内存百分比。
  • VSZ:虚拟内存占用大小(单位:KB)。
  • RSS:实际内存占用大小(单位:KB)。
  • TTY:终端类型。
  • STAT:进程状态。
  • START:进程启动时刻。
  • TIME:进程运行时长。
  • COMMAND:启动进程的命令。

TTY一列如果是“?”,则说明是后台进程。 

练习:下面练习查看进程信息,先在系统中打开一个Firefox浏览器,如下图所示。

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

 可以看到,Firefox主进程的PID是4436,其他几个是对应的子进程。

找出某进程的PID 除使用以上方法外,还可以使用pgrep命令,用法如下。

  • pgrep 名称 

例如,现在要查看Firefox的PID,命令如下。 

[root@rhel03 ~]# pgrep firefox
4436
[root@rhel03 ~]# 

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

[root@rhel03 ~]# pgrep -f firefox
4436
4700
4726
4803
4818
5086
[root@rhel03 ~]#

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

[root@rhel03 ~]# pidof firefox
5086 4818 4803 4726 4700 4436
[root@rhel03 ~]# 

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

[root@rhel03 ~]# pgrep -f firef
4436
4700
4726
4803
4818
5086
[root@rhel03 ~]#

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

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

 按【q】键退出。 


发送信号 

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

[root@rhel03 ~]# 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	
[root@rhel03 ~]# 

  也可以使用kill命令手动给进程发送信号,这里介绍3个常用的信号:15号信号、9号信号 和2号信号。

  15号信号,当单击右上角的【关闭】按钮去关闭一个程序时,系统发送的就是15号信号,这也是默认信号。在命令行中使用kill命令时,如果不指定信号,则是15号信号。 

在后台运行sleep命令,同时也显示了进程的PID,如下所示。

[root@rhel03 ~]# sleep 1000 &
[1] 5904
[root@rhel03 ~]# 

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

[root@rhel03 ~]# kill 5904
[root@rhel03 ~]# 
[1]+  已终止               sleep 1000
[root@rhel03 ~]#

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

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

按【Ctrl+C】组合键会终止正在运行的程序,即对对应的进程发送2号信号。

再次运行sleep命令,并把它放在后台运行,命令如下 

[root@rhel03 ~]# sleep 1000 &
[1] 5922
[root@rhel03 ~]# 

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

[root@rhel03 ~]# kill -2 5922
[root@rhel03 ~]# 
[1]+  中断                  sleep 1000
[root@rhel03 ~]# 

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

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

这样就强制关闭了。

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

[root@rhel03 ~]# sleep 1000 &
[1] 5941
[root@rhel03 ~]# sleep 1000 &
[2] 5950
[root@rhel03 ~]# sleep 1000 &
[3] 5951
[root@rhel03 ~]# sleep 1000 &
[4] 5952
[root@rhel03 ~]# 

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

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

进程优先级 

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

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

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

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

[root@rhel03 ~]# lscpu
架构:           x86_64
CPU 运行模式:   32-bit, 64-bit
字节序:         Little Endian
CPU:             1
在线 CPU 列表:  0
每个核的线程数: 1
每个座的核数:   1
座:             1
NUMA 节点:      1
厂商 ID:        GenuineIntel
BIOS Vendor ID:  GenuineIntel
CPU 系列:       6
型号:           154
型号名称:       12th Gen Intel(R) Core(TM) i7-1255U
BIOS Model name: 12th Gen Intel(R) Core(TM) i7-1255U

可以看到我现在只有一个CPU

下面运行两个cat进程,命令如下。 

[root@rhel03 ~]# cat /dev/zero > /dev/null &
[1] 5996
[root@rhel03 ~]# cat /dev/zero > /dev/null &
[2] 6003
[root@rhel03 ~]# 

然后再打开一个终端用 top进行查看,结果如下图所示。 

  可以看到,两个cat进程消耗的CPU是差不多的,因为它们的nice值相同,可以平等地消耗CPU资源。下面使用renice修改进程5996的nice值,改为-10,命令如下。 

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

这样进程5996会比进程6003占用更多的CPU资源,再次到top中查看,结果如下图所示。

 可以看到,5996占用的资源比6003多了很多。 

  刚才讲nice值越小越可得到更多的CPU资源,越大越不容易抢到资源,这里改成最大值19,命令如下。 

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

然后再到 top中查看,结果如下图所示。 

可以看到,5996只获取到了很少的CPU资源。关闭cat进程,命令如下。 

关闭cat进程,命令如下。

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学生成绩的增删改查

接上一篇MySQL数据库与其管理工具Navicat link 1.下载JDBC 可以登录MySQL的官方网站&#xff1a;www.mysql.com&#xff0c;下载JDBC-MySQL数据库驱动&#xff08;JDBC Driver for MySQL&#xff09;下载mysql-connector-java-5.1.40.zip后&#xff0c;将该zip文件解压至硬盘&a…

html和css写去哪儿导航条

目录 1、css代码 2、html代码 3、效果图 1、css代码 * {padding: 0;margin: 0;list-style: none;text-decoration: none;}.nav {height: 50px;background-color: rgb(36, 210, 188);margin-top: 50px;padding-left: 20px;}li {float: left;width: 75px;line-height: 50px;tex…

【EI会议征稿-ACM出版】2023年信息化教育与人工智能国际学术会议(ICIEAI 2023)

2023年信息化教育与人工智能国际学术会议&#xff08;ICIEAI 2023&#xff09; 2023 International Conference on Information Education and Artificial Intelligence 2023年12月22-24日 中国-厦门 2023年信息化教育与人工智能国际学术会议&#xff08;ICIEAI 2023&#xf…

8. 信号基础

8. 信号基础 1. 基本概念1.1 信号的目的是用来通信的1.2 信号由谁处理、怎么处理1.3 信号是异步的 2. 信号的分类2.1 可靠信号和不可靠信号2.2 实时信号和非实时信号 3. 进程对信号的处理3.1 signal()3.2 sigaction()3.2.1 struct sigaction3.2.2 实例 4. 向进程发送信号4.1 ki…

欧拉操作系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 这个章节主要是介…

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个&#xff1a; onLaunch(options)&#xff1a;当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;。onShow(options)&#xff1a;当小程序启动或从后台进入前台显示时&#xff0c;会触发 on…

CSS属性 display和visibility的区别

在CSS中&#xff0c;有两种让元素隐藏的方式&#xff0c;分别是display和visibility&#xff0c;他们有什么区别呢&#xff1f; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"…

[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群

一. Kubernetes(K8S)简介 Kubernetes (K8S) 是一个为 容器化应用 提供 集群部署 和 管理 的开源工具,和docker swarm类似,由 Google 开发. Kubernetes 这个名字源于希腊语,意为 “ 舵手 ” 或 “ 飞行员 ” , k8s 这个缩写是因为 k 和 s 之间有八个字符的关系, Google…

echarts 柱状图 定时自动轮播(非提示框轮播)

看了很多文档都是实现提示框轮播的&#xff0c;而我要实现的功能是&#xff1a;柱状图有多条数据时&#xff0c;轮播展示其中几条&#xff0c;比如我有100条数据&#xff0c;不能全部展示&#xff0c;设置轮播5条或者10条&#xff0c;依次显示数据&#xff0c;并形成闭环。 &a…

远程服务器——如何在Conda中安装R环境

目录 1. R的安装2. VScode 配置参考文献 1. R的安装 推荐使用anaconda或者miniconda&#xff0c;创建虚拟环R_env境然后安装R&#xff1b; 使用conda search r-base查看可下载的R的版本&#xff1b;R版本比较低&#xff0c;一般可以先增加源&#xff1a; % 增加源 conda con…

鸿蒙开发ArkTS语言—状态管理概述

概述 我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“Hello World”变更为“Hel…

一.初始typescript

什么是ts 首先我们要确认typescript是一个语言&#xff0c;是等同于JavaScript层级得&#xff0c;并不是一些人认为得是JavaScript得类型规范工具或者插件。 ts与js的差异 从type script这个名字就可以看出&#xff0c;ts其实是JavaScript的一个类型化超集&#xff0c;它增…

Python自动化测试通过日志3分钟定位bug

一、简单使用 入门小案例 1 2 3 4 5 6 7 8 import logging logging.basicConfig(levellogging.DEBUG, #设置级别&#xff0c;根据等级显示 format%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s) # 设置输出格式 logging.debug(This is a…

2024年度AI策略报告:AI浪潮扬帆起航,传媒应用百花齐放

今天分享的人工智能系列深度研究报告&#xff1a;《2024年度AI策略报告&#xff1a;AI浪潮扬帆起航&#xff0c;传媒应用百花齐放》。 &#xff08;报告出品方&#xff1a;兴业证券&#xff09; 报告共计&#xff1a;52页 1、行情回顾&#xff1a;板块处于较低区间&#xff0…

Java中实现HTTPS连接的最佳实践

引言 大家好&#xff01;我是小黑。今天咱们来聊聊一个既热门又实用的话题&#xff1a;在Java中如何实现HTTPS连接。现在的网络世界&#xff0c;安全性是大家都非常关注的问题&#xff0c;特别是对于咱们这些程序员来说&#xff0c;更是如此。想想看&#xff0c;如果你的网站或…

免费文章生成器的种类,3款免费的文章生成器推荐

内容创作无疑是网络营销和品牌建设中不可或缺的一环。许多人在日常工作中可能会面临时间不足、灵感枯竭等问题&#xff0c;本文将深入聊聊免费文章生成器的种类&#xff0c;详细介绍使用方法。 1. 免费文章生成器的种类 基于模板的生成器 这类生成器通常提供一系列文章模板&…

【LeetCode】每日一题 2023_12_7 重新规划路线(DFS/BFS)

文章目录 刷题前唠嗑题目&#xff1a;重新规划路线题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 这题好眼熟&#xff0c;怎么这几天都是这类问题&#xff01; 题目&#xff1a;重新规划路线 题目链接&#xff1a;1466.…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

uni-app 微信小程序之好看的ui登录页面(五)

文章目录 1. 页面效果2. 页面样式代码 1. 页面效果 2. 页面样式代码 <!-- 顶部蓝色 --> <template><view class"contaier"><view class"top-bg"><view class"text-white text-bold text-xxxl">前端铺子</view…

架构师-2.数据权限

数据权限,实现指定用户可以操作指定范围的数据。例如说,针对员工信息的数据权限: 上述的这个示例,使用硬编码是可以实现的,并且也非常简单。但是,在业务快速迭代的过程中,类似这种数据需求会越来越多,如果全部采用硬编码的方式,无疑会给我们带来非常大的开发与维护成…