如何使用 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 值来终止进程。例如,要终止 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 类似,但它还会生成进程内存的核心转储以用于调试目的。
您可以通过在 kill、pkill 或 killall 的选项中指定信号编号来使用这些信号。例如,要使用 SIGKILL 信号终止进程,您可以运行 −
$ kill -9 <PID>
根据进程状态终止进程
除了根据进程名称、用户或组终止进程外,您还可以使用 killall 根据进程状态终止进程。-s 选项允许您指定要终止的进程的状态。例如,要终止所有已停止的进程,您可以运行 -
$ killall -s STOPPED
同样,您可以使用 -s 选项并指定 RUNNING 状态来终止所有正在运行的进程 -
$ killall -s RUNNING
延迟终止进程
有时,在终止进程之前,让进程有机会执行一些清理操作会很有用。例如,您可能希望允许进程在终止之前保存其当前状态或释放一些资源。您可以使用带有 -s 选项的 kill 命令,在指定延迟后向进程发送信号。语法如下:-
$ kill -s <SIGNAL> -<SECONDS> <PID>
例如,要向延迟 10 秒的进程发送 SIGTERM 信号,您可以运行:-
$ kill -s TERM -10 <PID>
这将给进程 10 秒钟的时间进行清理,然后再终止它。
结论
在本文中,我们探讨了三个用于在 Unix 系统上终止进程的命令行实用程序:kill、pkill 和 killall。我们介绍了它们的基本用法、常用选项以及如何使用它们管理进程的示例。通过了解如何使用这些实用程序,您可以更好地控制系统,并更有效地处理无响应的进程。终止进程时务必谨慎,因为不当操作可能会导致数据丢失或系统不稳定。与往常一样,备份重要数据并查阅官方文档或寻求专家建议是一个好习惯,如果您不确定终止特定进程的后果。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

