简短回答:发送SIGTERM
,30 秒后,SIGKILL
。即发送SIGTERM
,稍等(可能因程序而异,您可能更了解您的系统,但 5 到 30 秒就足够了。关闭机器时,您可能会看到它自动等待长达 1'30 秒。毕竟为什么这么着急?),然后发送SIGKILL
.
合理答案:SIGTERM
,,,SIGINT
这SIGKILL
绰绰有余。该过程很可能会在之前终止SIGKILL
。
长答案:,,,,,, SIGTERM
_ SIGINT
_SIGQUIT
SIGABRT
SIGKILL
这是不必要的,但至少您不会误导有关您的消息的过程。所有这些信号确实意味着您希望进程停止正在执行的操作并退出。
无论您从这个解释中选择什么答案,请记住这一点!
如果您发送一个意味着其他东西的信号,该过程可能会以非常不同的方式处理它(一方面)。另一方面,如果进程不处理信号,那么无论你发送什么都无关紧要,进程无论如何都会退出(当然,当默认操作是终止时)。
因此,您必须将自己视为程序员。你会编写一个函数处理程序,比如说,SIGHUP
退出与某物连接的程序,还是循环它以尝试再次连接?这是这里的主要问题!这就是为什么只发送意味着你想要的信号很重要的原因。
几乎愚蠢的长答案:
下表包含相关信号,以及程序不处理它们时的默认操作。
我按照我建议使用的顺序订购了它们(顺便说一句,我建议您使用合理的答案,而不是这里的这个),如果您真的需要全部尝试(如果说桌子是按照以下顺序排列的,那会很有趣它们可能造成的破坏,但这并不完全正确)。
不推荐使用带星号 (*) 的信号。关于这些的重要一点是,您可能永远不知道它被编程做什么。特别SIGUSR
!它可能会开始启示录(对于程序员来说这是一个自由信号,可以做任何他/她想做的事情!)。但是,如果不处理或在不太可能的情况下处理终止,程序将终止。
在表中,带有用于终止和生成核心转储的默认选项的信号留在最后,就在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
然后我会建议这个几乎愚蠢的长答案:
SIGTERM
,,,,,,,,,SIGINT
SIGHUP
SIGPIPE
SIGQUIT
SIGABRT
SIGKILL
最后,
绝对是愚蠢的长长的答案:
不要在家里尝试这个。
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, , , , , , , , , , , , , , , , , , SIGQUIT
, SIGABRT
, SIGSEGV
, , .SIGILL
SIGFPE
SIGKILL
SIGUSR2
应该先尝试一下,SIGUSR1
因为如果程序不处理信号,我们会更好。SIGUSR1
如果它只处理其中一个,它更有可能处理。
顺便说一句, KILLSIGKILL
:正如其他答案所述,发送到进程并没有错。好吧,想想当你发送shutdown
命令时会发生什么?SIGTERM
它只会尝试SIGKILL
。你认为为什么会这样?shutdown
如果命令只使用这两个,为什么还需要任何其他信号?
现在,回到长答案,这是一个不错的单行:
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
的网民。总是用它来测试。
优雅地编写脚本
实际上我对这个问题很感兴趣,所以我决定创建一个小脚本来做到这一点。请随时在此处下载(克隆)它:
Killgracefully 存储库的 GitHub 链接