kill 命令中的 -9 选项有什么用途?

kill 命令中的 -9 选项有什么用途?

两者之间有什么区别吗

kill -9 212121

kill 212121

答案1

命令将发送一个定义的信号对于具有给定标识(PID)的进程:

kill -<signal> <pid>

当然,我们只能终止我们拥有的进程,而 root 可以终止所有进程。请参阅维基百科对计算信号进行了很好的总结。

可以发送的信号kill列在手册页。信号可以用名称或数字表示。如果没有给出信号,则TERM使用默认信号 15。

因此,以下所有三个命令都是相同的:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

SIGTERM和之间的区别SIGKILL在于应用程序对信号采取的操作方式:

  • TERM:应用程序将能够终止,即正确运行关机例程。
  • KILL:立即停止并终止应用程序(在某些情况下,这可能会导致数据丢失或引发报告假定崩溃的事件)。

答案2

Ubuntu 手册页kill解释了此开关的用途-9(诚然,解释得有些不连贯):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

以下是另一个手册页说。

该命令kill将指定的信号发送给指定的进程或进程组。如果未指定信号,则TERM发送信号。该TERM信号将终止未捕获该信号的进程。对于其他进程,可能需要使用KILL( 9) 信号,因为无法捕获该信号。


因此,使用-9开关可确保有效终止进程。即使冻结或无响应的进程可能不会响应简单的TERM 信号,但发送信号后它就会终止KILL

答案3

请注意,以下所有内容都是同义词:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

值得指出的是,在信号处理领域,终止信号是少数由操作系统而不是程序。运行 时kill -9,您不是在告诉应用程序终止自身,而是在告诉操作系统停止运行程序,无论程序正在做什么。

终止信号发送后,程序将立即停止。如果程序正在运行任何内核调用(例如文件 IO),这些调用可能会继续,也可能不会继续,直到完成,具体取决于调用,但程序本身将不再运行。请注意追踪在调试器下运行的任务在这里的行为可能会有所不同。

另一个无法阻止的信号是停止信号效果类似,但冻结该程序;你可以发送信号控制稍后再恢复。此行为完全由操作系统控制,程序不会收到任何事先通知。

所有其他信号都被发送给程序;程序可以选择以任何方式处理它们,或者,如果它忽略信号,则遵循默认行为。

以下是您可能会向进程发送的一些有用信号:

  • 信号--挂断
    告诉程序用户已断开连接(例如 SSH 会话或终端窗口已关闭)。
    通常会正常关闭程序。
  • 信号情报--打断
    当你按下CTRL+时发送C
    通常意味着“停止你正在做的事情”——可能会也可能不会终止程序
  • 信号终端 --终止
    kill和 发送的默认值killall
    通常会终止程序……有时是在程序完成正在执行的操作之后。
  • 停止信号--停止
    按下CTRL+Z
    暂停程序时发送,如上所述
  • 信号管道--管道关闭
    告诉程序管道已关闭。通常终止程序。
    例如,在打印第一行后cat /etc/passwd | head -n1将向进程发送 SIGPIPE ,导致在完成整个文件之前终止。catcat

虽然所有这些信号都会在其自身的环境中“自然”发生,但您可以使用信号来伪造条件以实现所需的结果。

例如,如果你想终止某人的 SSH 会话,你可以直接终止该进程,但这样做会阻止它更新其 HISTORY 文件,而出于安全原因,这可能很重要。但是如果你发送它信号,则该进程将假定连接已断开并执行其标准清理。

答案4

杀死-9含义:进程将被内核杀死;此信号不能被忽略。9 表示不可捕获或忽略的 KILL 信号

用途:终止信号信号

含义:不带任何信号的kill命令传递信号15,以正常方式终止进程。

用途:信号终端信号,可以由程序员处理

相关内容