本教程深入探讨了在 Linux 中管理进程的实际方面,这对于故障排除和资源管理来说是一项非常实用的技能。
译自 Linux: Manage System Processes,作者 Damon M Garn。
进程是正在运行的代码的实例。它是一个正在执行的程序,例如网页浏览器或文本编辑器。Linux 操作系统本身也由进程组成。这些正在运行的服务、应用程序和操作系统组件会消耗计算机上的资源,并可能访问数据。了解进程至关重要,因为它可以实现高效的资源管理和故障排除,这些任务通常属于 Linux 管理员的职责范围。
本教程深入探讨了在 Linux 中管理进程的实际方面。它为您提供了识别和显示进程的知识,这在故障排除和资源管理期间非常有用。您还将探索各种 Linux 实用程序,这些实用程序可以提供有关进程行为的见解,这对任何 Linux 用户或管理员来说都是宝贵的工具集。
要按照本教程的命令和示例进行操作,您需要一个可用的 Linux 发行版。无论您使用的是物理计算机还是虚拟计算机,任何 Linux 发行版都应该足够。请记住,虽然某些发行版可能包含不同的工具,但我将在本文中讨论的工具在大多数 Linux 发行版中都可以找到。本教程是关于 Linux 系统管理员的综合系列的一部分,旨在为您提供有效管理 Linux 环境所需的技能和知识。
您可以按照Linux:Linux 技能模块库的配套实验室文章中的信息构建一个实验室环境。
在本系列中,我们还介绍了 Linux 内核如何与硬件交互,如何Linux 管理系统服务以及如何Linux 管理用户。
进程是系统上正在执行的程序。它们包含几个组件,包括:
- 程序指令:由 CPU 处理的机器代码指令。
- 数据:进程操作的信息。
- 资源:进程消耗的处理器时间、内存空间、存储空间和网络连接。
- 进程 ID (PID):进程的唯一标识。PID 允许管理员引用进程以对其进行管理。
- 父进程 ID (PPID):生成您正在使用的进程的进程。
Linux 进程具有以下几个特点:
- 父进程和子进程的层次结构。
- 访问系统资源(主要是 CPU)的调度。
- 为了稳定性和安全性而隔离进程地址空间。
进程可能存在于几种状态中,即运行、休眠或停止。Linux 发行版包含各种工具来查看和管理系统上的进程。这些工具包括 ps
、pidof
、kill
等。本教程将检查多个实用程序。
如果您需要复习 Linux 命令的语法,请参考了解 Linux 命令行文章。
大多数情况下,Linux 用户和管理员通过命令或图形图标启动和停止应用程序来管理应用程序。启动这些应用程序会启动一个或多个进程。退出程序会结束这些进程。
以下是启动和停止 man
页面应用程序以显示 ls
命令的帮助文件的典型方法。
$ man ls
此命令启动运行机器代码所需的任何进程,构成 man
页面查看器应用程序。
通过选择 q 键优雅地退出 man
页面程序。这应该关闭程序,结束任何相关的进程。
注意:man
页面系统包含 Linux 文档。它对于显示帮助文件很有用,该文件显示命令的语法和各种选项(修饰符)。语法是 man program-name
,例如上面的 man ls
示例。
那么,需要进行哪些管理呢?如果应用程序启动和停止正常,管理员几乎不用担心。但是,如果程序无法正常运行,管理员可能需要手动关闭应用程序或检查它正在消耗哪些资源。
Linux 用户通过名称引用程序,例如 Vim 文本编辑器。但是,计算机通过 ID 号引用这些进程。
进程 ID (PID) 是 Linux 内核在进程生成(启动)时分配给进程的唯一数字。PID 很重要,因为它们是管理员关注进程的一种方式。管理员可能需要知道进程消耗了多少内存或处理器时间。如果进程没有正确退出,管理员可能还需要手动结束进程。
图 1:ps 命令的输出部分显示了一个用户手册进程。进程 ID 在第二列(340543)。
注意:以 root(管理员)用户身份登录 Linux 系统是一种糟糕的安全做法。大多数系统会强制您以普通用户身份登录,然后使用 sudo(超级用户执行)命令提升您的权限。使用 sudo 时,系统可能会提示您输入密码。本教程中的一些命令可能需要在您的 Linux 发行版上使用 sudo 命令。
主要的进程管理命令是 ps
。这个灵活而强大的命令可以显示进程并提供许多选项。
列出所有进程以及补充信息:
$ ps -ef
图 2:ps -ef 命令的部分输出。
这可能是大多数管理任务中最常见的 ps
命令用法。
ps -ef
命令显示所有正在运行的进程,这意味着您可能会得到大量的结果。在本教程的后面,我将向您展示如何使用 grep
实用程序过滤或搜索这些结果。
使用 -u
选项列出给定用户的进程:
$ ps -u username
参考 ps
的手册页 以了解其他选项。
程序通常在前景运行,这意味着它们会占用界面,您和系统都会专注于它们。但是,可以将进程在后台执行。这会导致它们运行,但允许您继续使用命令行界面 (CLI) 来完成其他任务。
要将进程置于前台和后台,您必须使用一组不同的标识符。具体来说,这些是作业 ID。作业 ID 与进程 ID 略有不同。进程 ID 在系统范围内进行标记,而作业 ID 在每个用户的基础上进行标识。所有作业都是进程,但并非所有进程都是作业(因为某些进程未分配给特定用户)。
当您第一次运行作业时,它会在前台执行,占用 shell 并阻止您运行其他命令。如果您要启动长时间的备份作业或其他需要一段时间才能运行的任务,这可能会成为问题。
您可以使用 Ctrl-Z 中断正在运行的进程,然后键入 bg
将其置于后台。您可以通过键入程序名称并添加 &
字符将程序直接启动到后台。
$ man ls &
此命令示例在后台运行 man ls
命令。
使用 jobs
命令显示正在运行的作业。
图 3: jobs 命令会显示当前手册页的任务。
使用 fg
命令和作业 ID 号将作业置于前台(可能用于检查其进度或状态)。
$ fg %1
图 4:找到手册页作业的作业号 (1),然后将其移至前台。
生产 Linux 系统可能同时运行数千个进程,这使得浏览或搜索 ps
命令输出变得困难。您可以将 ps
与名为 grep
的过滤或模式匹配实用程序结合使用,以找到您要查找的内容。
使用 ps
和 grep
的语法如下:
$ ps -ef | grep process_name
我将分解每个部分。
-
ps -ef
: 带有您想要的选项的ps
命令。 -
|
: “管道”字符获取第一个命令的输出并将其用作第二个命令的输入。在本例中,它获取ps
命令的结果(所有进程的列表)并将其作为grep
命令(搜索工具)的输入。 -
grep process_name
:grep
命令在ps
结果中搜索您指定的process_name
,将输出过滤或缩小到更易于管理的内容。
图 5:将 grep 模式匹配器添加到 ps 以过滤结果。
注意:您可以将 | grep pattern
与许多其他命令一起使用。使用 grep
的 -i
选项忽略大小写差异。例如,尝试使用 ls
命令搜索 /etc
目录(配置文件)中的任何网络文件和目录:
$ ls /etc | grep -i net
图 6:ls 命令等其他命令与 grep 结合使用的示例。
大多数应用程序将正常退出,这意味着它们将 CPU 时间和内存地址返回给操作系统并结束自己的进程。有时,应用程序不会正常退出,管理员必须使用 kill
命令结束进程。
kill 命令可以向应用程序发送各种信号,但最重要的信号是 -9 或 SIGKILL。此信号明确结束进程,强制其关闭并将资源返回给系统。
请注意,如果以这种方式结束程序,您将丢失任何未保存的数据。杀死进程通常是最后的手段。
该命令如下所示(假设 PID 为 9876):
$ kill -9 9876
其他信号包括:
- SIGINT (2): 中断或结束进程 (Ctrl+C)。
- SIGTERM (15): 优雅地结束进程。
杀死进程是一个严重的操作。尽可能尝试优雅地结束进程。
您可能会遇到的一个管理任务是消除僵尸进程。僵尸进程是已停止运行但未正确结束所有进程的程序的剩余组件。这些僵尸进程在不再支持应用程序时继续消耗进程 ID。这通常不是问题,但您应该注意它们。您需要通过结束父进程来清理僵尸进程。
同样,僵尸进程不会消耗太多 CPU 或内存资源,因此不必过于担心。
主要的进程管理工具是 ps,但还存在其他几个用于操作进程的有用工具。这些工具包括 pgrep、pidof 和 pstree。
pgrep 命令结合了 ps 和 grep 实用程序来简化对特定进程的搜索。添加 -l 选项以显示带有 PID 的实际进程名称。例如,要搜索与 SSH 实用程序相关的进程,请键入:
$ pgrep -l ssh
图 7:pgrep 命令显示 SSH 的进程信息。
pidof 命令显示正在运行的应用程序的 PID 信息。语法是 pidof 命令加上程序名称。
$ pidof program_name
图 8:pidof 命令显示 sshd 的进程信息。
请注意,程序名称可能与应用程序标题不同。
该命令对于发现进程 ID 很有用,以便您可以查看其资源或杀死它(如果需要)。
一些应用程序足够复杂,需要多个进程。其他应用程序为每个新的网络连接或服务请求分配新的进程。这些进程称为父进程,它们启动的子进程称为子进程。
在检查系统性能时,以可视化格式显示父进程及其相关的子进程可能会有所帮助。pstree 命令提供了这种功能。
如果没有指定参数或选项,pstree 显示系统上的所有进程。
$ pstree
图 9:pstree 命令的部分输出。
从您感兴趣的父进程开始显示 pstree 可能更有用。例如,要查看父进程 9876 的进程树,请键入以下命令:
$ pstree 9876
如果用户启动了程序,您可以显示该用户权限下运行的任何应用程序的进程(父进程和子进程)。使用此命令:
$ pstree username
添加 -p 选项以显示显示的进程的 PID:
$ pstree -p username
图 10:显示 damon 帐户使用进程的 pstree 命令的部分输出。
top 实用程序也显示进程信息。虽然 top 通常被认为是性能监控实用程序,但进程会消耗资源,从而影响系统的性能。您可以使用 top 与 ps 命令来确定哪些进程会导致问题。
图 11:顶端命令的上半部分显示进程信息,而下半部分显示实际进程。
一些 Linux 发行版使用 htop 命令作为更强大的替代方案 top。
Linux 用户和管理员将定期需要管理其系统上运行的代码。CPU 执行的代码称为进程,您可以使用 ps 命令显示进程和相关信息。进程管理的一个关键组成部分是进程 ID——系统用来识别进程的标签。您将使用此 PID 来调查或杀死进程(如果需要)。
其他 Linux 工具也与进程一起使用,包括 pgrep、pidof、pstree 和 top。使用这些工具来了解有关系统上运行内容的更多信息并解决问题。