返回博客

在 Linux 中管理进程——使用 ps、kill 和 nice 的指南

在 Linux 中管理进程——使用 ps、kill 和 nice 的指南

简介

当我们大多数人使用计算机时,我们会运行各种应用程序。这些应用程序由称为服务器或操作系统的程序运行。有许多不同种类的服务器以不同的方式工作。其中之一是 Linux。Linux 以进程的形式运行应用程序。

在 Linux 中,我们将每个应用程序称为“进程”。服务器能够管理进程生命周期的底层方面。作为用户,您可能需要与服务器交互以操作一些更高级别的方面。您可以使用各种工具与操作系统进行通信并对其进行管理。您可以使用许多命令来修改服务器的各个方面和功能。这里有一个易于遵循的 关于如何在 Ubuntu 上轻松设置基于 Linux 的服务器的教程。您可以进一步学习 如何安装 LAMP 架构(Linux、Apache、MySQL、PHP).

本指南重点介绍如何使用 ps、kill 和 nice 在 Linux 中管理进程。

在 Linux 中查看运行中的进程

  • top

首先,您应该知道的最基本的命令之一是 top。此工具可帮助您直观地查看系统上当前正在运行的进程。运行它时,它将显示如下:

top command output

 

在结果的顶部,您可以找到系统统计信息。这为您提供了有关系统负载和任务数量等信息。在此示例中,您可以确定有一个正在运行的进程和 55 个空闲进程。空闲或睡眠进程是您当前未使用的进程。这意味着它们没有占用系统资源。最后,您可以在弹出窗口底部附近看到所有运行中的进程及其使用情况统计信息。

  • htop

在使用此命令之前,您必须通过键入并运行以下命令从存储库中安装它:

安装完成后,您可以使用它来显示与 top 类似的信息。主要区别在于,使用 htop 命令,您可以获得更用户友好的结果:

htop command output

如您所见,此结果易于理解和解释。

使用 ps 列出进程

虽然您可以使用上述命令来查看运行中的进程,但它们可能无法涵盖所有场景。幸运的是,我们有一个更强大、更灵活的工具可供使用。这就是 ps 命令。

让我们来看看直接运行该命令会看到什么:

ps command output

在此输出中,您可以看到与当前用户和会话相关的所有正在运行的进程。但是,这并不能为您提供很多信息。

如果您想更全面地查看系统上运行的所有进程,则需要使用参数。参数允许您查看所有用户拥有的所有进程,无论其终端关联如何。输出也以非常用户友好且易于阅读的格式显示。以下是一个示例:

ps aux

另一方面,您也可以以树状格式直观地查看此信息。在这里,如您所见,层级关系也变得一目而然:

output in tree format

在此示例中,您可以看到 kthreadd 是如何显示为后续进程的父进程的。

  • 什么是进程 ID?

作为 Linux 或 Unix 用户,您应该了解进程 ID。进程 ID 也称为 PID,是系统分配给每个进程的唯一标识。服务器通过这些标识来跟踪每个单独的进程。要了解给定进程的 PID,您必须使用 pgrep 命令,如下所示:

当您启动系统时,第一个进程开始运行。这个进程被称为 init。作为默认机制,init 进程获取的 PID 为“1”。您可以按如下方式检查该进程的 PID:

然后,init 进程负责启动所有其他程序或进程。可以理解的是,后续进程将具有递增或更大的 PID。

  • 什么是父进程?

另一个需要了解的概念是父进程。如果进程 A 派生了进程 B,那么进程 A 就是进程 B 的父进程。为了帮助区分它们,系统会为父进程分配一个 PPID。每当你运行 top、htop 和 ps 等任何管理命令时,都可以在列标题中注意到这个 PPID。

  • 什么是父子关系?

正如我们已经知道的,父进程会派生子进程。这种创建过程分为两个步骤。第一步是 fork()。这首先会创建一个新的地址空间。它还会使用写时复制(copy-on-write)复制父进程的资源,以便子进程也可以使用这些资源。第二步是 exec()。这负责在新建的地址空间中加载并执行可执行文件。

  • 如果子进程在父进程之前死亡会怎样?

如果发生这种情况,子进程就会变成僵尸进程。也就是说,直到父进程收集了有关它的某些信息,或者告诉内核它不需要相关信息为止。一旦发生这种情况,该进程之前使用的资源现在将被释放。

  • 如果父进程在子进程之前死亡会怎样?

在这种情况下,系统会将该子进程重新分配给另一个父进程。它可能是 init 或任何其他进程。

在 Linux 中向进程发送信号

你可以通过发送信号来让特定的进程对你做出响应。信号可以帮助你与操作系统进行通信。你可以使用信号来使应用程序终止、启动或修改特定的行为或任务。

  • 使用 PID 发送信号

在 Linux 中,你可以用来发送信号的工具之一是 kill。顾名思义,这个命令可以帮助你终止或杀死一个进程:

该工具向进程发送 TERM 信号,告诉它终止该进程。该命令使应用程序能够轻松地进行清理并退出。如果程序在收到 TERM 信号后无法顺利退出,你可以直接发送 KILL 信号:

此信号不会发送给程序。它会发送给操作系统内核。内核将直接关闭该进程。当程序忽略你向其发送的信号时,你可以使用此方法。

在此命令中,你还可以将信号的名称替换为与其关联的数字。例如,你可以使用 ‘-15’ 代替 ‘-TERM’。同样,你可以将 ‘-KILL’ 替换为 ‘-9’。

  • 将信号用于各种目的

除了杀死或终止程序之外,你还可以使用信号来做其他事情。例如,你可能需要处理重启守护进程的问题。每当守护进程收到挂起信号或 HUP 时,它就会在诸如 Apache 之类的程序中重启。要覆盖此行为,你可以使用以下信号:

此命令将使 Apache 重新加载其配置。因此,它将继续为你提供相关内容。

如果你想查看可以使用 kill 工具发送哪些信号,请使用以下命令:

list of signals

  • 按名称发送信号

传统上,你会使用程序的 PID 来发送信号。但是,你也可以选择使用进程的常规名称来发送信号。为此,你可以使用 pkill 命令。它的工作方式与 kill 命令类似。唯一的区别是它允许你使用进程名称:

此 pkill 命令等同于以下 kill 命令:

当你想要向每个实例而不是特定进程发送信号时,你还可以使用一个命令。以下命令将向系统上运行的所有 Firefox 实例发送 TERM 信号:

调整进程优先级

使用 Linux 命令可以做的另一件事是调整优先级。这意味着您可以决定在服务器环境中哪个进程具有优先权。您可能会认为某些进程至关重要,而其他进程则不那么必要。系统只会在有剩余资源时才执行后者。

您可以通过 niceness 命令在 Linux 中控制进程优先级。该值将高优先级任务表示为 less nice(不够友好),将低优先级进程表示为 more nice(比较友好)。可以这样想:高优先级进程不够友好,因为它们在独占资源。低优先级任务在分享资源,所以它们更友好。

运行 top 命令时,您可以查看给定进程的 nice 值。该值位于 ‘NI’ 列中。高优先级任务的 nice 值在 ‘-19/-20’ 之间。低优先级进程的 nice 值在 ‘19/20’ 之间。您将看到类似以下的内容:

如果您想使用自定义指定的 nice 值运行进程,只需使用 nice 命令:

此命令仅在启动指定程序时有效。如果您想更改已在运行的程序的 nice 值,则必须使用 renice:

结论

如您所见,这里的工具与图形界面工具大不相同。因此,对于初学者来说可能很难理解。本指南将帮助您熟悉这些命令。多加练习将帮助您更好地掌握并更高效地使用它们。

查看我们的其他资源,它们可以帮助您更好地管理 Linux 服务器,包括以下方面的教程:如何配置 Linux 服务器以使用基于 SSH 密钥的身份验证, 使用 whereis、which、whatis、readlink 和 find 在 Linux VPS 系统上定位文件,以及在 Linux VPS 上读取和设置环境变量及 Shell 变量.

祝您使用愉快!

author

Akshay Nagpal

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。