简短答案:SIGTERM
30秒后发送SIGKILL
。也就是说SIGTERM
,稍等一下(发送,等待(每个程序可能有所不同,您可能对系统了解得更多,但是5到30秒就足够了。)关闭计算机时,您可能会看到它自动等待1'30秒。毕竟为什么要着急?),然后发送SIGKILL
。
合理的答案:SIGTERM
,SIGINT
,SIGKILL
这是绰绰有余。该过程很可能在之前终止SIGKILL
。
长的答案:SIGTERM
,SIGINT
,SIGQUIT
,SIGABRT
,SIGKILL
这是不必要的,但是至少您不会误导有关您的消息的过程。所有这些信号确实意味着您希望进程停止正在执行的操作并退出。
无论您从该解释中选择什么答案,请记住这一点!
如果您发送的信号表示其他内容,则该过程可能会以非常不同的方式(一方面)处理该信号。另一方面,如果该进程不处理信号,则无论您发送什么内容都无所谓,该进程仍然会退出(当然,默认操作是终止时)。
因此,您必须像程序员一样思考。您是否愿意编写一个函数处理程序,SIGHUP
以便退出一个与某物连接的程序,或者您将其循环以再次尝试连接?这是这里的主要问题!这就是为什么仅发送表示您意图的信号很重要的原因。
几乎愚蠢的长答案:
下表中包含相关信号,以及程序不处理它们时的默认操作。
如果您确实需要尝试全部使用它们,我可以按照我建议使用的顺序对其进行排序(顺便说一句,我建议您使用合理的答案,而不是此处的答案)(有趣的是,表的排列顺序是它们可能造成的破坏,但这并不是完全正确的)。
不建议带星号(*)的信号。关于这些的重要事情是,您可能永远都不知道它的编程功能。特别是SIGUSR
!它可能会启动apocalipese(这是程序员做他/她想要做的事的免费信号!)。但是,如果不处理或在极少数情况下处理终止,程序将终止。
在该表中,最后带有缺省选项的信号可以终止并生成核心转储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
如果只处理其中之一,则更有可能处理。
顺便说一句,杀人:发送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秒。您为什么还需要一个内衬?;)
另外,建议:仅使用15 2 9
来自合理答案的信号进行尝试。
安全:echo
准备就绪时,请取下第二个。我称其dry-run
为网上购物者。始终使用它进行测试。
优雅地杀死脚本
实际上,我对这个问题很感兴趣,因此我决定创建一个小的脚本来完成此操作。请随时在这里下载(克隆)它:
GitHub链接到Killgracefully仓库