在一个 评论这个答案 另一个 的问题, ,评论者说:

不使用杀-9,除非绝对 有必要!SIGKILL不能这么困 被杀的节目不能运行 关闭程序,例如擦除 临时文件。第一次尝试HUP(1), 然后INT(2),然后退出(3)

我原则上同意关于 SIGKILL, 但剩下的就是新闻到我。鉴于默认发送的信号 killSIGTERM, 我希望这是最常期望的信号正常关闭的任意程序。此外,我有看到 SIGHUP 用于非终止原因,例如,告诉守护"重读你的配置文件"。 而在我看来这 SIGINT (同样的打断你通常会获得与Ctrl-C对吗?) 不是作为广泛支持,因为它应该是,或终止,而非正常.

SIGKILL 是去度假 这些信号,并且在什么样的顺序, ,你应该送到任意的过程中,为了关闭它作为正常的可能吗?

请佐证你的答案与支持的事实(超越个人偏好或意见)或引用,如果可以的话。

注:我特别感兴趣的最佳做法,包括考虑bash/Cygwin。

编辑: 迄今为止,似乎没有人提INT或退出,并没有限于提HUP。是否有任何原因包括这些在一个有秩序的过程中杀?

有帮助吗?

解决方案

SIGTERM讲述了一个应用程序终止。其他信号告诉应用其他事情无关的关闭但有时可能具有相同的结果。不要使用那些。如果你想要一个应用程序关闭,告诉它。不给它误导信号。

有些人认为终止过程的智能标准方法是通过发送它的信号,如HUP,INT,TERM最后KILL摆。这是荒唐的。终止正确的信号是SIGTERM如果SIGTERM不会立即终止进程,因为你可能会喜欢,这是因为应用程序已选择来处理信号。这意味着它有一个很好的理由不立即终止:它有清理工作要做。如果中断与其他信号的清理工作,也没有说从内存中哪些数据还没有保存到磁盘,什么客户端应用程序是左悬挂或无论你将其中断“中一句话”,这实际上是数据损坏。

有关什么信号的真正意义是更多信息,请参见sigaction的(2)。不要混淆“默认动作”与“说明”,他们是不一样的东西。

SIGINT用于用信号的处理的交互式“键盘中断”。某些程序可以处理在用于终端用户的目的特殊方式的情况

SIGHUP用于通知该终端已经消失并且不再看过程。就这些。一些工艺选择关闭响应,通常是因为它们的操作是没有意义的无终端,一些选择做其它事情,如再值的配置文件。

SIGKILL用于强行从内核中除去的过程。正是在这个意义上,它实际上不是一个信号处理,而是被直接内核解释特殊。

不要发送SIGKILL。 SIGKILL当然应该永远不会被发送的脚本。如果应用程序处理SIGTERM,它可以把它的第二清理,它可以采取分钟,的它可以采取一小时即可。根据什么应用程序必须得到完成它的准备结束之前。任何逻辑“假设”的应用程序的清理序列已经采取足够长的时间,并且需要快捷方式或X秒后SIGKILLed是的只是简单的错误

的唯一原因申请会的需要的一个SIGKILL终止,如果是其清理序列中的东西窃听了。在这种情况下,你可以打开一个终端并手动SIGKILL它。除此之外,唯一的其他原因,为什么你会SIGKILL东西是因为你的需要的,以防止其自我整顿。

尽管全球一半5秒它仍然是可怕的错误的事情。之后盲目发送SIGKILL

其他提示

<强>短应答:发送SIGTERM,30秒后,SIGKILL。也就是说,发送SIGTERM,稍等一下(可以从程序到程序各不相同,你可能知道你的系统更好,但5到30秒就足够了。当关闭一台机器,你可以看到它自动等待长达1'30s为什么在匆忙,毕竟?),则发送SIGKILL

<强>合理的答案SIGTERMSIGINTSIGKILL 这是绰绰有余。这一过程将非常 SIGKILL之前可能终止。

<强>长回答SIGTERMSIGINTSIGQUITSIGABRTSIGKILL

这是不必要的,但至少你是不是误导关于你的消息的进程。所有这些信号的的意思是你想的过程中停止它在做什么并退出。

不管你从这个解释选择什么样的答案,记住这一点!

如果您发出一个信号,意味着别的东西,该方法可以处理它以非常不同的方式(一方面)。在另一方面,如果过程不处理的信号,这不要紧,你毕竟送什么,该流程反正会退出(当默认动作是终止,当然)。

所以,你必须考虑自己一样作为一个程序员。你的代码的函数处理程序,可以说,SIGHUP退出与连接东西的程序,或者你会循环它尝试重新连接?这是这里的主要问题!这就是为什么只送意味着您打算什么信号是非常重要的。

<强>几乎笨龙回答

在表波纹管包含了相关的信号,并且将默认操作的情况下,所述程序不处理它们。

我命令他们在为了我建议使用(顺便说一句,我建议你使用的合理的答案的,不是这一个在这里),如果你真的需要尝试所有(这将是开玩笑地说该表中,他们可能会造成的破坏方面所订购,但不是的完全的真)。

有星号(*)的信号是不会推荐。这些重要的是,你可能永远不知道它是什么程序做的。特别SIGUSR!它可以开始apocalipse(它是一个程序员一个自由信号做他/她想要什么!)。但是,如果不是在不可能的情况下,处理这是处理终止,该程序将终止。

在该表中,使用默认选项的信号来终止,并产生一个核心转储留在端,只是SIGKILL之前。

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGTERM      15       Term    Termination signal
SIGINT        2       Term    Famous CONTROL+C interrupt from keyboard
SIGHUP        1       Term    Disconnected terminal or parent died
SIGPIPE      13       Term    Broken pipe
SIGALRM(*)   14       Term    Timer signal from alarm
SIGUSR2(*)   12       Term    User-defined signal 2
SIGUSR1(*)   10       Term    User-defined signal 1
SIGQUIT       3       Core    CONTRL+\ or quit from keyboard
SIGABRT       6       Core    Abort signal from abort(3)
SIGSEGV      11       Core    Invalid memory reference
SIGILL        4       Core    Illegal Instruction
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal

然后我会建议这个的几乎傻长的答案的: SIGTERMSIGINTSIGHUPSIGPIPESIGQUITSIGABRTSIGKILL

最后,

<强>绝对笨龙隆回答

不要在家里尝试。

SIGTERMSIGINTSIGHUPSIGPIPESIGALRMSIGUSR2SIGUSR1SIGQUITSIGABRTSIGSEGVSIGILLSIGFPE并且如果没有奏效,SIGKILL

SIGUSR2应该SIGUSR1之前,因为我们将迎来如果程序不处理的信号更好受审。它更可能为它处理SIGUSR1如果它处理的只是其中之一。

<强>顺便说一句,该KILL :这是没有错送SIGKILL到一个过程中,由于其他的答案说明。那么,认为当你发送一个命令shutdown会发生什么?它会尝试SIGTERM只有SIGKILL。为什么你认为是这样吗?为什么你需要的任何其它信号,如果非常shutdown命令仅使用这两个?


现在,回到长的答案,这是一个很好的oneliner:

for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done

有休眠信号之间30秒。否则为什么你会需要的 oneliner 的? ;)

另外,推荐:与来自在合理的答案仅信号15 2 9尝试。

安全的:除去第二echo当你准备好去。我把它称为我的dry-run为的 onliners 的。总是用它来测试。


<强>脚本killgracefully

其实我被这个问题,我决定创建一个小的脚本来做到这一点兴趣。请在这里随意下载(克隆),它:

GitHub的连结 Killgracefully库

通常你会送SIGTERM,杀的默认。这是有原因的默认。只有当程序没有关闭在合理时间内,你应该诉诸SIGKILL。但要注意,与SIGKILL程序有没有可能清理东西UND数据可能会损坏。

至于SIGHUPHUP代表“挂断”和历史意味着调制解调器断开。它本质上等同于SIGTERM。该守护程序有时使用SIGHUP重新启动或重新加载配置的原因是守护进程从任何控制终端分离作为守护程序并不需要这些,因此将永远不会收到SIGHUP,使信号被视为“腾出”用于一般用途。并非所有的守护进程用这个重载!对SIGHUP的默认行为是终止,许多守护进程行为是那样的!所以你不能去盲目地发送到SIGHUPs守护程序和期待他们的生存。

修改 SIGINT可能是不适当的终止的方法,因为它通常依赖于^C或任何终端设置是中断程序。许多程序捕获该为自己的目的,所以它是很常见它不工作。 SIGQUIT通常创建一个核心转储的默认值,除非你想核心文件周围铺设这不是一个很好的候选人,无论是。

摘要:如果您发送SIGTERM和程序不会将您的时间内死亡然后把它SIGKILL

SIGTERM 实际上意味着发送应用程序的消息: “你会这么好心和自杀的”。它可以通过运行应用程序的清理和关闭代码被捕获和处理。

<强> SIGKILL 不能被应用捕获。应用程序获取通过OS杀害,没有任何机会进行清理。

这是典型的先发SIGTERM,睡眠一段时间,然后发送SIGKILL

  • SIGTERM相当于"点击'X'"在一个窗口。
  • SIGTERM是什么Linux用第一,当时它正在关闭。

通过所有的讨论会在这里,没有代码已经提供。这是我的看法:

#!/bin/bash

$pid = 1234

echo "Killing process $pid..."
kill $pid

waitAttempts=30 
for i in $(seq 1 $waitAttempts)
do
    echo "Checking if process is alive (attempt #$i / $waitAttempts)..."
    sleep 1

    if ps -p $pid > /dev/null
    then
        echo "Process $pid is still running"
    else
        echo "Process $pid has shut down successfully"
        break
    fi
done

if ps -p $pid > /dev/null
then
    echo "Could not shut down process $pid gracefully - killing it forcibly..."
    kill -SIGKILL $pid
fi

HUP听起来像垃圾我。我把它拿到一个守护进程重新读取它的配置。

SIGTERM可以截获;你的守护进程才可能有清理代码,当它接收到的信号来运行。你不能这样做,对SIGKILL。因此,与SIGKILL你不给守护程序的作者的任何选项。

更多关于该上维基百科

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top