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

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

1. Kill、pkill 和 Killall 的基本用法

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

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

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

2. 使用kill的示例

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

2.1 通过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

2.2 通过PID终止多个进程

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

$ kill 1234 5678

2.3 终止属于某个用户的所有进程

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

$ kill -u jdoe

3. 使用 pkill 的示例

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

3.1 按名称终止进程

pkill 最基本的用法是按名称终止进程。例如,要终止 Firefox Web 浏览器的所有实例,您可以运行 –

$ pkill firefox
$ pkill php-fpm
$ pkill nginx

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

3.2 通过进程组 ID 终止进程

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

$ pkill -g 1234

3.3 由用户终止进程

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

$ pkill -u jdoe

4. 将kill、pkill 和killall 与信号选项结合使用

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

  • SIGKILL (9) – 这是最激烈的信号,将立即终止进程,不允许它执行任何清理操作。它在进程无响应且需要立即终止的情况下很有用。
  • SIGHUP (1) – 该信号通常用于指示进程重新加载其配置文件。有些进程在收到此信号时也会终止。
  • SIGINT (2) – 当用户按下 Ctrl-C 时,此信号通常发送到进程。它指示进程优雅地终止。
  • SIGQUIT (3) – 该信号与 SIGINT 类似,但它也会生成进程内存的核心转储以用于调试目的。

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

$ kill -9 <PID>

4.1 根据进程状态终止进程

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

$ killall -s STOPPED

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

$ killall -s RUNNING

4.2 延迟终止进程

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

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

例如,要向延迟 10 秒的进程发送 SIGTERM 信号,您可以运行 –

$ kill -s TERM -10 <PID>

这将在进程终止前给进程 10 秒的时间进行清理。

参考:https://www.tutorialspoint.com/how-to-end-processes-with-kill-pkill-and-killall

Leave a comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注