bash – 我应该以什么顺序发送信号以正常关闭进程?

前端之家收集整理的这篇文章主要介绍了bash – 我应该以什么顺序发送信号以正常关闭进程?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在另一个 questionthis answercomment评论者说:

don’t use kill-9 unless absolutely
necessary! SIGKILL can’t be trapped so
the killed program can’t run any
shutdown routines to e.g.erase
temporary files. First try HUP(1),
then INT(2),then QUIT(3)

我原则上同意SIGKILL,但剩下的是对我的消息。假设kill发送的默认信号是SIGTERM,我会期望它是用于正常关闭任意进程的最常见的预期信号。此外,我看到SIGHUP用于非终止的原因,如告诉守护进程“重新读取您的配置文件”。在我看来,SIGINT(你通常用Ctrl-C得到的同样的中断,对吗?)没有得到广泛支持,或者不合适地终止。

鉴于SIGKILL是最后的手段 – 哪些信号,以什么顺序,你应该发送到一个任意的过程,以尽可能优雅地关闭它?

请证明您的答案与支持事实(超出个人偏好或意见)或参考,如果可以。

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

编辑:到目前为止,没有人提到INT或QUIT,并且对HUP的提及有限。有任何理由将这些包括在有序的过程杀戮中吗?

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

有些人认为终止进程的智能标准方法是通过发送一系列信号,如HUP,INT,TERM和最后KILL。这是荒唐的。正确的终止信号是SIGTERM,如果SIGTERM不立即终止进程,你可能更喜欢,这是因为应用程序已经选择处理信号。这意味着它有一个非常好的理由不立即终止:它有清理工作要做。如果你中断清理工作与其他信号,没有告诉什么数据从内存,它还没有保存到磁盘,什么客户端应用程序被挂起,或者你是否中断它“中期”,这是有效的数据损坏。

有关信号的真正含义的更多信息,请参阅sigaction(2)。不要将“默认操作”与“说明”混淆,他们不是同一件事。

SIGINT用于表示过程的交互式“键盘中断”。一些程序可以以特殊方式为终端用户的目的处理这种情况。

SIGHUP用于表示终端已经消失,并且不再查看进程。就这些。一些进程选择关闭响应,一般是因为他们的操作没有意义没有终端,一些选择做其他事情,如重新检查配置文件

SIGKILL用于强制从内核中删除该进程。这是特别的,它不是一个实际上是一个信号的过程,而是直接由内核解释。

不要发送SIGKILL。 SIGKILL肯定不会被脚本发送。如果应用程序处理SIGTERM,它可以花一秒钟来清理,它可能需要一分钟,它可能需要一个小时。根据应用程序必须完成之前,它准备结束。任何“假定”应用程序清理序列的逻辑已经花费了足够长的时间,并且需要在X秒后出现快捷方式或SIGKILL。

应用程序需要SIGKILL来终止的唯一原因是,如果在清理序列期间出现了错误。在这种情况下,您可以手动打开终端和SIGKILL。除此之外,唯一的另一个原因,为什么你SIGKILL的东西是因为你想防止它清理自己。

这不是因为一半的世界使用SIGKILL 5秒后,这不是可怕的错。

猜你在找的Bash相关文章