终止进程是 Linux 中进程管理的关键部分。
由于进程管理是一个独立的主题,所以我不会在这篇文章中详细介绍管理用户进程和信号处理。
我将专注于使用 SIGTERM 和 SIGKILL 终止进程的信号. 我还将讨论为什么应该避免使用 SIGKILL。
什么是 SIGTERM?
在类 UNIX 系统中,SIGTERM 信号用于终止程序。 你几乎可以从它的名字中猜到,它由 SIGnal 和 TERMinate 组成。
SIGTERM 也可以称为软终止,因为接收到 SIGTERM 信号的进程可能会选择忽略它。
换句话说,这是终止进程的礼貌方式。
如何将 SIGTERM 发送到 Linux 中的进程?
Linux 中的 kill 命令用于将所有此类信号发送到进程。
默认情况下,kill 命令发送 SIGTERM 信号。 您可以用 -15 明确提及它,但这是多余的。
你需要 知道进程的pid 为了以下列方式使用此命令:
kill <process_id>
您可以在 Linux 中使用 ps 命令获取进程 ID。
什么是 SIGKILL?
SIGKILL 用于立即终止进程。 该信号不能被忽略或阻止。 该进程将与其线程(如果有)一起终止。
这是杀死进程的残酷方式,只能作为最后的手段。 假设您有一个无响应的进程想要 close. 在这种情况下可以使用 SIGKILL。
如何将 SIGKILL 发送到 Linux 中的进程?
您可以使用选项 -9 通过 kill 命令发送 SIGKILL 信号并立即终止进程:
kill -9 <process_id>
SIGTERM vs SIGKILL:为什么你更喜欢使用 SIGTERM 而不是 SIGKILL?
尽管这两个信号都用于终止进程,但两者之间存在一些差异:
- SIGTERM 优雅地终止进程,而 SIGKILL 立即终止进程。
- SIGTERM 信号可以被处理、忽略和阻塞,但 SIGKILL 不能被处理或阻塞。
- SIGTERM 不会杀死子进程。 SIGKILL 也会杀死子进程。
一些 Linux 用户习惯于使用“kill -9”,这是你应该避免的。 除非您有一个无响应的进程,否则您不需要使用 SIGKILL。
使用 SIGTERM,进程有时间将信息发送到其父进程和子进程。 它的子进程由 init 处理。
使用 SIGKILL 可能会导致僵尸进程的创建,因为被杀死的进程没有机会告诉其父进程它已收到终止信号。
这部漫画出自 关掉 幽默地解释了 SIGTERM 和 SIGKILL 之间的区别。
我希望您现在对使用 SIGTERM 或 SIGKILL 杀死进程有更好的理解。
如果您有任何问题或建议,请随时发表评论。