如何使用 kill、pkill 和 killall 结束进程


在使用基于 Unix 的操作系统(如 Linux 或 macOS)时,经常会遇到进程无响应或需要出于某种原因终止的情况。幸运的是,有一些可用的命令行实用程序允许用户以多种方式结束进程。在本文中,我们将探讨三种最常用的用于终止进程的实用程序:kill、pkill 和 killall。我们将介绍它们的用法、常见选项以及如何在 Unix 系统上使用它们来管理进程的示例。

kill、pkill 和 killall 的基本用法

在深入研究具体示例之前,了解每个实用程序的基本用法很有帮助。

kill 是一种命令行实用程序,用于向进程发送信号以终止它。默认情况下,kill 发送 TERM 信号,要求进程优雅地终止自身。如果进程对 TERM 信号没有响应,则可以发送 KILL 信号,该信号会立即终止进程。

pkill 与 kill 类似,但它允许您根据进程名称或其他属性向进程发送信号。例如,您可以使用 pkill firefox 终止所有 Firefox 浏览器实例。

killall 与 pkill 类似,但它仅根据名称匹配进程。当您想终止特定程序的所有实例时,这很有用。

使用 kill 的示例

让我们从一些使用 kill 结束进程的示例开始。

根据 PID 终止单个进程

kill 最基本的用法是根据其进程 ID (PID) 终止单个进程。要查找进程的 PID,您可以使用 ps 命令 -

$ ps aux | grep process_name

这将显示与指定名称匹配的进程列表。输出的第二列显示每个进程的 PID。

获得 PID 后,您可以使用 kill 命令终止进程 -

$ kill pid

例如,要终止 PID 为 1234 的进程,您将运行 -

$ kill 1234

这将向进程发送 TERM 信号,要求它优雅地终止自身。如果进程没有响应,您可以使用 -9 选项发送 KILL 信号,这将立即终止进程 -

$ kill -9 1234

根据 PID 终止多个进程

如果您需要一次终止多个进程,则可以将多个 PID 值传递给 kill。例如,要终止 PID 为 1234 和 5678 的进程,您将运行 -

$ kill 1234 5678

终止属于某个用户的全部进程

如果您想终止属于特定用户的全部进程,则可以使用 -u 选项指定用户的用户名。例如,要终止属于用户“jdoe”的所有进程,您将运行 -

$ kill -u jdoe

使用 pkill 的示例

接下来,让我们看看一些使用 pkill 终止进程的示例。

根据名称终止进程

pkill 最基本的用法是根据名称终止进程。例如,要终止所有 Firefox 浏览器实例,您将运行 -

$ pkill firefox

这将向名称包含“firefox”的所有进程发送 TERM 信号。如果这些进程中的任何一个没有响应 TERM 信号,则将向其发送 KILL 信号。

根据进程组 ID 终止进程

除了根据名称终止进程外,pkill 还可以根据其进程组 ID (PGID) 终止进程。PGID 是操作系统为每个进程组分配的唯一标识符。要终止特定进程组中的所有进程,您可以使用 -g 选项后跟 PGID。例如,要终止进程组 1234 中的所有进程,您将运行 -

$ pkill -g 1234

根据用户终止进程

pkill 还允许您根据拥有它们的用户的进程终止进程。您可以使用 -u 选项指定用户的用户名。例如,要终止属于用户“jdoe”的所有进程,您将运行 -

$ pkill -u jdoe

使用 killall 的示例

最后,让我们看看一些使用 killall 终止进程的示例。

根据名称终止进程

killall 最基本的用法是根据名称终止进程。例如,要终止所有 Firefox 浏览器实例,您将运行 -

$ killall firefox

这将向名称为“firefox”的所有进程发送 TERM 信号。如果这些进程中的任何一个没有响应 TERM 信号,则将向其发送 KILL 信号。

根据用户终止进程

与 pkill 一样,killall 也允许您根据拥有它们的用户的进程终止进程。您可以使用 -u 选项指定用户的用户名。例如,要终止属于用户“jdoe”的所有进程,您将运行 -

$ killall -u jdoe

根据组终止进程

killall 还允许您根据其组 ID 终止进程。您可以使用 -g 选项指定组 ID。例如,要终止组 1234 中的所有进程,您将运行 -

$ killall -g 1234

将 kill、pkill 和 killall 与信号选项一起使用

到目前为止,我们只讨论了如何使用这些命令使用默认信号(SIGTERM 或 15)终止进程。但是,还有其他信号可用于终止进程。需要注意的是,某些信号可能会导致进程在终止之前执行特定操作,例如保存数据或清理资源。以下是一些可与 kill、pkill 和 killall 一起使用的信号选项示例 -

  • SIGKILL (9) - 这是最激进的信号,它将立即终止进程,而不会允许它执行任何清理操作。在进程无响应且需要立即终止的情况下,它很有用。

  • SIGHUP (1) - 此信号通常用于指示进程重新加载其配置文件。某些进程在收到此信号时也会终止。

  • SIGINT (2) - 当用户按下 Ctrl-C 时,此信号通常会发送到进程。它指示进程优雅地终止。

  • SIGQUIT (3) - 此信号类似于 SIGINT,但它还会生成进程内存的 core dump 以用于调试目的。

您可以通过将它们的信号编号指定为 kill、pkill 或 killall 的选项来使用这些信号。例如,要使用 SIGKILL 信号终止进程,您将运行 -

$ kill -9 <PID>

根据进程状态终止进程

除了根据进程的名称、用户或组终止进程外,您还可以使用 killall 根据其状态终止进程。-s 选项允许您指定要终止的进程的状态。例如,要终止所有停止的进程,您将运行 -

$ killall -s STOPPED

类似地,您可以使用 -s 选项和 RUNNING 状态终止所有正在运行的进程 -

$ killall -s RUNNING

延迟终止进程

有时,在终止进程之前让它有机会执行一些清理操作会很有用。例如,您可能希望允许进程保存其当前状态或在终止之前释放一些资源。您可以将 kill 命令与 -s 选项一起使用,以便在指定的延迟后向进程发送信号。语法如下 -

$ kill -s <SIGNAL> -<SECONDS> <PID>

例如,要向进程发送 SIGTERM 信号并延迟 10 秒,您将运行 -

$ kill -s TERM -10 <PID>

这将给进程 10 秒的时间进行清理,然后它将被终止。

结论

在本文中,我们探讨了三种用于在 Unix 系统上终止进程的命令行实用程序:kill、pkill 和 killall。我们介绍了它们的用法、常见选项以及如何在 Unix 系统上使用它们来管理进程的示例。通过了解如何使用这些实用程序,您可以更好地控制系统并更有效地处理无响应的进程。在终止进程时务必谨慎,因为操作不当会导致数据丢失或系统不稳定。与往常一样,建议备份重要数据,并在不确定终止特定进程的后果时咨询官方文档或寻求专家建议。

更新于:2023-03-23

3K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告
© . All rights reserved.