如何使用 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 系统上使用它们来管理进程的示例。通过了解如何使用这些实用程序,您可以更好地控制系统并更有效地处理无响应的进程。在终止进程时务必谨慎,因为操作不当会导致数据丢失或系统不稳定。与往常一样,建议备份重要数据,并在不确定终止特定进程的后果时咨询官方文档或寻求专家建议。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP