SIGTERM vs SIGKILL:有什么区别?

时间:2020-03-05 15:29:40  来源:igfitidea点击:

终止进程是Linux中进程管理的关键部分。

由于进程管理本身就是一个主题,因此在本文中,我将不涉及管理用户进程和信号处理的详细信息。

我将专注于使用SIGTERM和SIGKILL信号终止进程。

我还将讨论为什么我们应该避免使用SIGKILL。

什么是SIGTERM?

在类UNIX系统中,SIGTERM信号用于终止程序。
我们可以从它的名称(由SIGnal和TERMinate组成)的名称中猜测到这一点。

SIGTERM也可以称为软终止,因为接收SIGTERM信号的进程可以选择忽略它。

换句话说,这是杀死进程的一种礼貌方式。

如何在Linux中将SIGTERM发送到进程?

Linux中的kill命令用于将所有此类信号发送到进程。

默认情况下,kill命令发送SIGTERM信号。
我们可以用-15明确提及它,但这是多余的。

我们需要了解该过程的pid才能以以下方式使用此命令:

kill <process_id>

我们可以在Linux中使用ps命令来获取进程ID。

什么是SIGKILL?

SIGKILL用于立即终止进程。
此信号不可忽略或者阻止。
该进程将与其线程(如果有)一起终止。

这是杀死进程的一种残酷方式,应仅将其用作最后的手段。
假设我们要关闭一个无响应的进程。
在这种情况下可以使用SIGKILL。

如何将SIGKILL发送到Linux中的进程?

我们可以使用选项-9发送带有kill命令的SIGKILL信号并立即终止该进程:

kill -9 <process_id>

SIGTERM与SIGKILL:为什么比SIGKILL更喜欢使用SIGTERM?

尽管这两个信号都用于终止进程,但两者之间还是有一些区别的:

  • SIGTERM正常终止进程,而SIGKILL立即终止进程。
  • 可以处理,忽略和阻止SIGTERM信号,但不能处理或者阻止SIGKILL。
  • SIGTERM不会终止子进程。 SIGKILL也会杀死子进程。

一些Linux用户习惯于使用“ kill -9”,这是我们应避免的事情。
除非进程没有响应,否则我们无需使用SIGKILL。

使用SIGTERM,进程可以花时间将信息发送到其父进程和子进程。
它的子进程由init处理。

使用SIGKILL可能会导致创建僵尸进程,因为被杀死进程没有机会告诉其父进程它已经收到了杀死信号。