![kill 命令中的 -9 选项有什么用途?](https://linux22.com/image/962943/kill%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%20-9%20%E9%80%89%E9%A1%B9%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8%E9%80%94%EF%BC%9F.png)
两者之间有什么区别吗
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 ,导致在完成整个文件之前终止。cat
cat
虽然所有这些信号都会在其自身的环境中“自然”发生,但您可以使用信号来伪造条件以实现所需的结果。
例如,如果你想终止某人的 SSH 会话,你可以直接终止该进程,但这样做会阻止它更新其 HISTORY 文件,而出于安全原因,这可能很重要。但是如果你发送它信号,则该进程将假定连接已断开并执行其标准清理。
答案4
杀死-9含义:进程将被内核杀死;此信号不能被忽略。9 表示不可捕获或忽略的 KILL 信号
用途:终止信号信号
杀含义:不带任何信号的kill命令传递信号15,以正常方式终止进程。
用途:信号终端信号,可以由程序员处理