前言

进程是正在运行的程序,Linux系统通常有数百个进程同时运行。本文就来介绍下Linux是如何进行进程管理的。

我们可以看到:

  • 查看进程(Viewing processes)
  • 查找进程(Finding processes)
  • 管理进程(Managing processes)
  • 进程的优先级(Prioritizing processes)
  • 杀死进程(Killing processes)
  • 在后台运行进程(Running processes in the background)
  • 调度进程(Scheduling processes)

查看进程

ps

Linux内核在创建进程时,会按顺序给每个进程分配一个唯一的进程ID(PID)。一般来说,在进程上执行任何操作,我们必须指定PID,有时我们可以使用名称。

ps命令是查看进程的主要工具。不使用任何选项来运行该命令,会列出当前登录用户所启动(调用)的进程,以及终端上正在运行的进程。

如果我们添加了aux选项:

  • a = 显示所有用户的进程
  • u = 显示进程的用户/所有者
  • x = 显示未连接到终端的进程

进程按照它们被启动的顺序进行展示,因此你会看到列表是根据PID进行排序的。

让我们简单来看看下面几列的信息:

  • USER:调用进程的用户。
  • PID:进程的ID。
  • %CPU:进程占用CPU的百分比。
  • %MEM:进程占用内存的百分比。
  • COMMAND:启动进程的命令。

查找命令

grep

我们可以使用grep命令来查找指定的进程,假设我们想要查找所有名称中包含mfsconsole的进程。

ps aux | grep msfconsole

top

我们可以使用top命令来动态地罗列出,按照资源使用情况排序的进程,从最大的开始罗列。默认情况下,该列表将每3秒刷新一次。

top

管理进程

优先级

内核对进程的优先级有最终决定权,但是我们可以使用nice命令,来建议应该提升进程的优先级。nice命令的值范围是从-20(最有可能得到优先权)到+19(最不可能得到优先权)。

较高的nice值转换为低优先级,较低的nice值转换为高优先级。

当一个进程启动后,所有的标准进程都以nice值0来进行启动。

我们可以使用nice命令来设置一个进程启动时的nice值,我们可以使用renice来调整一个运行中的进程的nice值。

当我们使用nice命令启动一个进程但没有提供任何值时,默认的nice值是10。

nice命令要求你递增nice值,renice命令想要一个绝对的nice值。

设置优先级

我们可以使用nice命令来调整一个程序的nice值。这允许我们提高或降低内核提供给该进程的优先级,相对于其他进程而言。

在左边,我执行watch -n1 free 来展示系统内存使用情况的细节。在右边,我让top命令运行,你可以看到watch命令的PID是9717,nice的值为0。

让我们继续执行watch命令,只不过这次是用nice命令。

nice -15 watch -n1 free

现在我们可以看到watchnice值为15。这里要牢记的几件事:

  • 这个watch命令的PID与之前的watch命令不同。这是因为nice会启动一个新的进程,而不是更改一个现有的进程。
  • nice命令后面的-15意味着15。如果我们想要指定一个负数(高优先级),我们可以使用双中划线-
  • 下面是执行sudo nice --10 watch -n1 free后的样子。是的,如果你要提高优先级,你必须使用sudo。任何人都可以降低优先级,但只有sudo可以提高优先级。

改变优先级

renice命令接收-2019的绝对值,并接收进程的PID

让我们再次运行watch命令。

watch -n1 free

让我们来检查下nice值,既然我们没有指定nice值,它应该为0。比起使用top,这里我将会使用psgrep,用以简化输出。

我们可以看到,第八列的值为0,该值为nice的值,PID的值位于第三列。让我们使用renice试试:

sudo renice -15 14318

我们可以看到,现在nice的值是-15。我们也可以使用top工具来改变nice值。

top中,按下R键,并提供一个PID

按下回车键,并提供一个新的nice值:

top成功的改变了nice值:

杀死进程

kill

你可以通过kill命令来停止一个有问题的进程。kill命令有64种不同的kill信号,以及语法是kill -signal PID 。如果没有显示的提供信号位,将会默认为SIGTERM 。这里我将重点介绍以下几种:

信号名称 数值 描述
SIGHUP 1 挂断(HUP)信号。它停止指定的进程,并以相同的PID重新启动它。
SIGINIT 2 中断(INT)信号。这是一个微弱的kill信号,不保证能起作用,但确实有这样的情况。
SIGQUIT 3 核心转储。终止进程并将进程信息保存在内存中,然后它将这些信息保存在当前工作目录下一个名为core的文件中。
SIGTERM 15 终止(TERM)信号。它是kill命令的默认kill信号。
SIGKILL 9 这是一个绝对的kill信号。它通过将进程的资源发送到一个特殊的设备/dev/null来迫使进程停止。

下面的命令会通过HUP信号来重启我们的watch命令。

kill -1 14318

下面的命令会确保进程被终止。

kill -9 16318

如果我们不知道PID,我们可以使用killall命令,它接收进程的名称。

killall -9 watch

在后台运行进程

&

当你执行一个命令时,shell会进行等待,直到命令完成后才提供另一个命令提示。我们可以在后台运行一个进程,它将继续运行而不需要终端,把终端腾出来做其他工作。我们在命令的末尾添加&来做到这一点。

geany sample.txt &

geany不再占用整个终端。

fg

我们如何让它回到前台?可以使用带有PID的fg命令。

fg 18345

bg

你也可以使用bg命令来移动一个进程到后台。

bg 18345

调度进程

在Linux中,我们可以使用atcrond来调度进程。crond有点复杂,这里重点介绍at

at

at命令对于安排一项工作在未来某个时间点运行一次很有用。它设置了atd守护进程。守护进程是一个位于后台的程序,在没有任何用户界面的情况下做自己的事情。

下面是at命令执行进程的时间的语法,时间可以以多种格式提供。

时间格式 含义
at 7:20pm Run at 7:20 PM of current day.
at 7:20pm June 25 Run at 7:20 PM on June 25
at now + 20 minutes Run in 20 minutes
at 7:25pm 06/10/2021 Run at 7:25 pm on June 10, 2021
at noon

我们可以看到,at将我们带入了交互模式,在这里我们输入了我们希望在指定时间执行的命令。完成后按下CTRL+D。

atq

使用atq来罗列出所有预定的at工作。

Linux系列之进程管理的更多相关文章

  1. Linux学习之进程管理(十九)

    Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps ...

  2. 【Linux学习】Linux系统管理1—进程管理

    Linux系统管理1-进程管理 一.Linux的三种进程 Linux包括3中不同类型的进程: 交互进程:由一个shell启动的进程.交互进程可以在前后台运行 批处理进程:该进程和终端无联系,是一个进程 ...

  3. Linux学习之进程管理

    |-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/p ...

  4. Linux网络和进程管理

     1) 计算机网络是通过外围的设备和连接,将分布在相同或不同区域的多台计算机 连接在一起所形成的集合.网络中的计算机实现彼此间互相通信,并且可以共 同使用硬件.软件和数据资源,实现资源共享.Lin ...

  5. Linux网络配置&进程管理

     原理图 查看ip和网关

  6. Linux系统分区 进程管理 软件包安装

    对于一块新的磁盘来说,系统能够使用需要有分区.格式化文件系统.挂载等主要操作,下面通过命令的方式对一块磁盘进行操作. 一. Linux系统分区 1.1 在虚拟机开机前选择虚拟机配置,添加一个新的SCS ...

  7. 深入Linux内核架构——进程管理和调度(下)

    五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...

  8. 深入Linux内核架构——进程管理和调度(上)

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

  9. Linux系统编程@进程管理(一)

    课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...

随机推荐

  1. 操作系统实现-loader

    博客网址:www.shicoder.top 微信:18223081347 欢迎加群聊天 :452380935 大家好呀,终于我们到了操作系统的loader部分了,loader也是操作系统中最重要的一个 ...

  2. 玩转ASP.NET 6.0框架-序言

    ASP.NET Core是微软提供的强大的web框架,它有很多潜在的强大而有用的功能. 本专栏的目标是帮助您把框架的隐藏能力最大限度地发挥出来,让您能够按需定制ASP NET Core框架.本专栏提供 ...

  3. Python的.gitignore模板

    参考:https://github.com/github/gitignore Python的.gitignore模板,记录一下方便查询 # Byte-compiled / optimized / DL ...

  4. mysql查询关键字补充与多表查询

    目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...

  5. 【SpringCloud原理】万字剖析OpenFeign之FeignClient动态代理生成源码

    年前的时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇.今天就继续接着剖析Sprin ...

  6. Spark 3.x Spark Core详解 & 性能优化

    Spark Core 1. 概述 Spark 是一种基于内存的快速.通用.可扩展的大数据分析计算引擎 1.1 Hadoop vs Spark 上面流程对应Hadoop的处理流程,下面对应着Spark的 ...

  7. 从数字化概念到落地,都说是一道坎,JNPF能为企业带来什么呢?​

    数字经济席卷全球推动产业转型是必然趋势,人类社会正在数字化大潮中发生深刻变革,数字化越来越成为推动经济社会发展的核心驱动力.企业正处于数字经济大潮的风口浪尖,故企业经验决策者应深刻认识数字化转型对于企 ...

  8. Spring Security OAuth正式终止维护,已从官网下架

    Spring Security团队正式宣布Spring Security OAuth终止维护. 目前官网的主页已经高亮提醒彻底停止维护. 旧的Spring Security OAuth项目终止到2.5 ...

  9. MVVM,MVC,MVP的区别

    MVC.MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率. 在开发单页面应用时,往往一个路由页面对应了一个脚本文件,所有的页面逻辑都在一个脚本文 ...

  10. UiPath文本操作Get Visible Text的介绍和使用

    一.]Get Visible Text(获取可见文本)操作的介绍 从指示的UI元素中提取字符串及其信息.执行屏幕抓取操作时,还可以自动生成此活动以及容器. 二.Get Visible Text在UiP ...