有时候每当我写一个计划在Linux和它崩溃,由于一个错误的某种形式,它将成为一个不间断的进程和继续运行直到永远我重新启动我的电脑(即使我日志)。我的问题是:

  • 是什么原因导致的进程成为不间断?
  • 我如何阻止这事情发生?
  • 这可能是一个愚蠢的问题,但是否有任何方式中断它,而无需重新启动我的电脑吗?
有帮助吗?

解决方案

一个不间断的过程是一个过程,它发生在一个呼叫系统(核心功能),不能被打断了一个信号。

来明白这意味着什么,你需要理解这个概念的一个interruptable系统的呼吁。经典的例子是 read().这是一种系统的话,可能需要很长的时间(秒),因为它可能涉及纺立一个硬盘驱动器,或运动首长。在大多数的这个时候,该进程将在睡觉,阻止上的硬件。

虽然过程是沉睡的系统中的呼吁,它可以接收unix步信号(说,SIGTERM),那么以下情况:

  • 系统调用过早地退出,并设置了返回-EINTR到用户空间。
  • 信号处理程序是执行。
  • 如果该进程仍在运行,它们得到的回报价值系统的呼吁,它可以做出同样的呼吁。

提前回国,从该系统调使用空间代码立即改变其行为的响应信号。例如,终止干净的反应,信号情报或SIGTERM.

另一方面,一些系统的电话都不允许中断这种方式。如果系统通话摊位对于一些原因,该进程可以无限期地留在这不死的状态。

LWN跑了 不错的文章 涉及本主题。

回答原来的问题:

  • 如何防止这种情况发生:找出哪些驱动程序是你造成麻烦,要么停止使用,或成为一个核心的黑客,并修复它。

  • 如何杀死一个不间断的过程,而不必重新启动:以某种方式使该系统通话终止。经常最有效的方式做到这一点没有打电源开关拔电源线。你也可以成为一个核心的黑客和使驾驶员使用TASK_KILLABLE,作为解释的LWN的文章。

其他提示

当一个进程是在用户的方式,它可以中断在任何时间(换为核心的模式)。当核心返回到用户的方式,检查是否有任何信号有待(包括那些都是用来杀人的过程,例如 SIGTERMSIGKILL).这意味着一个进程可以被杀,只有在返回的用户模式。

原因过程中不能被杀死在核心模式是,它可能会破坏该核心机构使用的所有其他进程,在同一台机器(同样的方式杀死一线可能会破坏使用的数据结构的其他线在同一个过程)。

当核心需要做一些东西,可能需要很长一段时间(在等待一个管的书面通过另一种程序或等待的硬件要做的事情,例如),它睡觉的通过标记本身如睡眠和呼叫调度程序,以切换到另一个进程(如果没有非睡眠过程中,就切换到一个"虚拟"的过程,讲述了cpu来慢一点,坐在一个循环的空闲循环)。

如果一个信号发送到一个睡觉的过程,它已经被唤醒之前将回复到用户的空间,并因此处理的未决的信号。在这里,我们有差之间的两种主要类型的睡眠:

  • TASK_INTERRUPTIBLE, ,可中断的睡眠。如果任务是标明用这种标志,它是在睡觉,但可以被唤醒的信号。这意味着代码标出的任务,因为睡期待一个可能的信号,并在这醒来将检查这及返回系统的呼吁。之后信号处理方式,系统调可能可以自动重新启动的(而我不会详细信息关于如何,作品)。
  • TASK_UNINTERRUPTIBLE, ,不间断的睡眠。如果任务是标明用这种标志,这不是期待被唤醒通过的任何其他不管它是什么在等待,或者是因为它无法轻易地重新启动,或者是因为程序的期待的系统调用原子的。这也可以用于睡觉称为是非常短。

TASK_KILLABLE (提及在LWN文章链接,通过ddaa的答复)是一个新变体。

这回答你的第一个问题。作为你的第二个问题:你不能避免不间断睡觉,他们是一个正常的事情(发生这种情况,例如,每一次处理读写从/向盘);然而,他们应该去只有一小部分的第二种。如果他们长得多,这通常意味着硬件的问题(或装置驱动程序的问题,它看起来相同的核心),其中的设备的司机是等硬件做一些它永远不会发生。它可能还意味着你正在使用NFS和NFS服务器(它正在等待服务器到恢复;你也可以使用"侵"选项,以避免的问题)。

最后,你的原因无法恢复是相同的理由的核心等待,直到返回到用户的方式提供一个信号或杀死的过程:它可能会损坏内核的数据结构(代码等待一个可中断的睡眠可以接收到一个错误,它告诉它回到用户的空间,那里的进程可以杀死;代码等待一个不间断的休眠不期待任何误差)。

不间断的进程通常是等待I/O以下一页的错误。

考虑这样的:

  • 线试图访问网页是不是在核心(不论是一个可执行的,这是需求载一页的匿名存已被换出来,或mmap()'d的文件,该文件要求载,它们多同样的事情)
  • 内核是现在(试图)载在
  • 该进程不能继续下去,直到页。

该程序/任务不会中断,在这种状态,因为它不能处理任何信号;如果它这样做,另一页会发生故障,它会回来在那里它是。

当我说"过程",我的意思是"任务",它在Linux(2.6)大致翻译为"线",这可能有或可能没有一个单独的"线组"条/proc

在某些情况下,它可能正在等待很长一段时间。一个典型的例子,这将是可执行或mmap会文件在文件系统网络服务器已经失败。如果I/O最终成功,该任务将继续下去。如果它最终的失败,任务通常会得到一个SIGBUS或东西。

你的第3个问题:我认为你可以杀死的不间断过程在运行 sudo kill -HUP 1.它将重新启动初始没有结束运行的进程和运行之后,我不间断的进程已经走了。

如果你说的是"僵尸"处理(被指定为"僵尸"在ps出),然后这是一个无害的记录在处理列在等待有人来收集其返回代码和它可能被忽略。

能否请你描述什么,以及"不间断的过程"是你吗?不存在"杀死的-9"和愉快地一班班吗?如果是这种情况,那么它的粘在一些系统调用,这是停留在一些驱动程序,而你坚持用这个过程,直到重新启动(和有时是更好地重新启动快)或卸载的有关司机(这是不可能发生)。你可以尝试使用"strace",以找出你的过程中被卡住,并避免它的未来。

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