了解如何使用 ps、kill 和 killall 命令来终止进程并回收系统资源。

在 Linux 中,每个程序和守护程序daemon都是一个“进程process”。 大多数进程代表一个正在运行的程序。而另外一些程序可以派生出其他进程,比如说它会侦听某些事件的发生,然后对其做出响应。并且每个进程都需要一定的内存和处理能力。你运行的进程越多,所需的内存和 CPU 使用周期就越多。在老式电脑(例如我使用了 7 年的笔记本电脑)或轻量级计算机(例如树莓派)上,如果你关注过后台运行的进程,就能充分利用你的系统。

你可以使用 ps 命令来查看正在运行的进程。你通常会使用 ps 命令的参数来显示出更多的输出信息。我喜欢使用 -e 参数来查看每个正在运行的进程,以及 -f 参数来获得每个进程的全部细节。以下是一些例子:

$ psPID TTY          TIME CMD88000 pts/0    00:00:00 bash88052 pts/0    00:00:00 ps88053 pts/0    00:00:00 head
$ ps -e | headPID TTY          TIME CMD1 ?        00:00:50 systemd2 ?        00:00:00 kthreadd3 ?        00:00:00 rcu_gp4 ?        00:00:00 rcu_par_gp6 ?        00:00:02 kworker/0:0H-events_highpri9 ?        00:00:00 mm_percpu_wq10 ?        00:00:01 ksoftirqd/011 ?        00:00:12 rcu_sched12 ?        00:00:00 migration/0
$ ps -ef | head
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 13:51 ?        00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36
root           2       0  0 13:51 ?        00:00:00 [kthreadd]
root           3       2  0 13:51 ?        00:00:00 [rcu_gp]
root           4       2  0 13:51 ?        00:00:00 [rcu_par_gp]
root           6       2  0 13:51 ?        00:00:02 [kworker/0:0H-kblockd]
root           9       2  0 13:51 ?        00:00:00 [mm_percpu_wq]
root          10       2  0 13:51 ?        00:00:01 [ksoftirqd/0]
root          11       2  0 13:51 ?        00:00:12 [rcu_sched]
root          12       2  0 13:51 ?        00:00:00 [migration/0]

最后的例子显示最多的细节。在每一行,UID(用户 ID)显示了该进程的所有者。PID(进程 ID)代表每个进程的数字 ID,而 PPID(父进程 ID)表示其父进程的数字 ID。在任何 Unix 系统中,进程是从 1 开始编号,是内核启动后运行的第一个进程。在这里,systemd 是第一个进程,它催生了 kthreadd,而 kthreadd 还创建了其他进程,包括 rcu_gp、rcu_par_gp 等一系列进程。

使用 kill 命令来管理进程

系统会处理大多数后台进程,所以你不需要操心这些进程。你只需要关注那些你所运行的应用创建的进程。虽然许多应用一次只运行一个进程(如音乐播放器、终端模拟器或游戏等),但其他应用则可能创建后台进程。其中一些应用可能当你退出后还在后台运行,以便下次你使用的时候能快速启动。

当我运行 Chromium(作为谷歌 Chrome 浏览器所基于的开源项目)时,进程管理便成了问题。 Chromium 在我的笔记本电脑上运行非常吃力,并产生了许多额外的进程。现在我仅打开五个选项卡,就能看到这些 Chromium 进程:

$ ps -ef | fgrep chromium
jhall      66221   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      66230   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
[...]
jhall      66861   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      67329   65132  0 15:45 pts/0    00:00:00 grep -F chromium

我已经省略一些行,其中有 20 个 Chromium 进程和一个正在搜索 “chromium" 字符的 grep 进程。

$ ps -ef | fgrep chromium | wc -l
21

但是在我退出 Chromium 之后,这些进程仍旧运行。如何关闭它们并回收这些进程占用的内存和 CPU 呢?

kill 命令能让你终止一个进程。在最简单的情况下,你告诉 kill 命令终止你想终止的进程的 PID。例如,要终止这些进程,我需要对 20 个 Chromium 进程 ID 都执行 kill 命令。一种方法是使用命令行获取 Chromium 的 PID,而另一种方法针对该列表运行 kill:

$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}'
66221
66230
66239
66257
66262
66283
66284
66285
66324
66337
66360
66370
66386
66402
66503
66539
66595
66734
66848
66861
69702$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids
$ kill $(cat /tmp/pids)

最后两行是关键。第一个命令行为 Chromium 浏览器生成一个进程 ID 列表。第二个命令行针对该进程 ID 列表运行 kill 命令。

介绍 killall 命令

一次终止多个进程有个更简单方法,使用 killall 命令。你或许可以根据名称猜测出,killall 会终止所有与该名字匹配的进程。这意味着我们可以使用此命令来停止所有流氓 Chromium 进程。这很简单:

$ killall /usr/lib64/chromium-browser/chromium-browser

但是要小心使用 killall。该命令能够终止与你所给出名称相匹配的所有进程。这就是为什么我喜欢先使用 ps -ef 命令来检查我正在运行的进程,然后针对要停止的命令的准确路径运行 killall。

你也可以使用 -i 或 --interactive 参数,来让 killkill 在停止每个进程之前提示你。

killall 还支持使用 -o 或 --older-than 参数来查找比特定时间更早的进程。例如,如果你发现了一组已经运行了好几天的恶意进程,这将会很有帮助。又或是,你可以查找比特定时间更晚的进程,例如你最近启动的失控进程。使用 -y 或 --young-than 参数来查找这些进程。

其他管理进程的方式

进程管理是系统维护重要的一部分。在我作为 Unix 和 Linux 系统管理员的早期职业生涯中,杀死非法作业的能力是保持系统正常运行的关键。在如今,你可能不需要亲手在 Linux 上的终止流氓进程,但是知道 kill 和 killall 能够在最终出现问题时为你提供帮助。

你也能寻找其他方式来管理进程。在我这个案例中,我并不需要在我退出浏览器后,使用 kill 或 killall 来终止后台 Chromium 进程。在 Chromium 中有个简单设置就可以进行控制:

不过,始终关注系统上正在运行哪些进程,并且在需要的时候进行干预是一个明智之举。

如何在 Linux 上使用 kill 和 killall 来管理进程相关推荐

  1. linux上查看网络限制,如何在Linux上限制网络带宽

    您是否曾经与多个设备共享网络带宽?如果您曾经处于一个应用程序占用了所有流量的位置,那么您是系统管理员还是Linux用户,您将需要发现如何控制应用程序的上载和下载速度,以确保您的带宽并不完全被单个应用程 ...

  2. linux下安装sbt_如何在Linux上安装SBT

    linux下安装sbt 介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you how to install ...

  3. 如何在Linux上找到包含特定文本的所有文件?

    我正在尝试找到一种方法来扫描整个Linux系统,查找包含特定文本字符串的所有文件. 只是为了澄清,我在文件中寻找文本,而不是文件名. 当我查找如何做到这一点时,我遇到了两次这个解决方案: find / ...

  4. docker删除所有容器_如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 我的官方群点击此处 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个 ...

  5. 如何在 Linux 上安装服务器管理软件 Cockpit

    如何在 Linux 上安装服务器管理软件 Cockpit Cockpit 是一个自由开源的服务器管理软件,它使得我们可以通过它好看的 web 前端界面轻松地管理我们的 GNU/Linux 服务器.Co ...

  6. 更改日期为英文_如何在 Linux 上检查所有用户密码到期日期 | Linux 中国

    如果你很少使用自己的帐户,那么可能由于密码过期而被锁定.在许多情况下,这可能会在无需密码登录的服务帐户中发生,因为没人会注意到它. -- Magesh Maruthamuthu(作者) 如果你在 Li ...

  7. linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动

    如何在Linux上自动记录所有用户的终端会话活动 不久前,我们写了一篇文章,使用script命令记录Linux终端会话活动. 今天,我们还将讨论相同的主题. 但是,本教程允许您自动记录所有用户的终端会 ...

  8. 如何在Linux上使用VIM进行.Net Core开发

    对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...

  9. 如何在linux上安装sqlite数据库

    如何在linux上安装sqlite数据库 一.下载 二.解压 三.配置(configure) 四.编译和安装 五.执行sqlite3程序 六.测试代码 一.下载 首先要先下载sqlite3源码包 链接 ...

最新文章

  1. 【HDU 1501】Zipper(记忆化搜索)
  2. T-SQL 之 表变量和临时表
  3. chrome浏览器下用几行js代码实现写入剪贴板功能
  4. [转]Angular 单元测试讲解
  5. ASP中巧用Response属性
  6. 洛谷P3233 [HNOI2014]世界树
  7. 网络通信框架 HP-Socket v5.5.1,支持可靠 UDP
  8. Android——简单模拟银行转账
  9. matlab 匹配滤波相位谱,第1章匹配滤波器.doc
  10. ARM_kafka搭建
  11. java中间件技术有哪些?
  12. 【STM32学习】基于STM32F411CEU6的USB储存设备
  13. 心灵奇旅中不认识的单词和句子
  14. react-router 里的 routerLink标签和a 标签有什么区别
  15. adb安装应用限制解除
  16. 使用LabVIEW 开发远程电子工程实验课
  17. python计算平均绩点_平均绩点的算法?
  18. Door Man poj 1300
  19. tmocat ssl 证书 生成 过程
  20. Unity项目运行时动态更新光照贴图 | LightMap

热门文章

  1. 程序员春节必备金句,简直不能再机智!
  2. celery的使用(最新详细解析)
  3. 故对于回调函数来说,在其内部使用 this 是不把稳的做法,解决方案可以在其调用时使用 call / apply / bind 显示绑定。
  4. 时间换算_只愿与一人十指紧扣_新浪博客
  5. JavaWeb实现分页的四种方法
  6. 教您如何查看MySQL用户权限
  7. SAX解析XML文档——(二)
  8. Luke 5—— 可视化 Lucene 索引查看工具,可以查看ES的索引
  9. 使用nodejs安装Vue-cli
  10. Java NIO使用及原理分析(三)