如何防止进程被杀死?

如何防止进程被杀死?

无论如何,有没有什么办法可以防止进程被终止?我知道,nice但我不确定是否给予诸如长时间运行的内存密集型任务rake最高优先级可以防止它被终止:

nice -n -20 rake xyz

编辑:原始海报很可能希望它具有高优先级,即使服务器资源不足,以至于其他进程首先被终止。

答案1

您无法阻止 root 终止进程。或者说:您无法阻止服务器终止消耗所有资源的进程。

您可以做的是分叉命令,以便它在被终止时自行重新启动。

使用代码的示例:

答案2

现在,我知道这是一个老问题了,但由于这两个答案都忽略了显而易见的问题——或者最多只是触及了表面——我觉得有必要写一个自己的答案。考虑到这个问题的措辞,我脑海中首先想到的是“OOM 杀手!”。另一个答案甚至声称“杀死某些东西不是自动的”,这从用户的角度来看是荒谬的。如果不是自动的,OOM 杀手是什么?

OOM 杀手是您在上述场景中最大的敌人,如链接文章所示。

现在这取决于具体的情况(构建机器,一些服务器......),但一般来说我我希望我的操作系统能够尽可能地利用我机器的资源。这就是我当初购买它们的原因。

您的问题细分如下:

无论如何,有没有什么方法可以防止进程被终止?

不,幸运的是不会。例如,内核将杀死行为不当的进程(例如通过发送错误信息)。如果您的任务由于遇到资源限制而出现异常,这也将适用(请参阅限制配置文件getrlimit/setrlimit)。也就是说,如果您的rake任务中的某些内容(很可能会使用其他进程来完成某些工作)取消引用了空指针,那么您仍然会倒霉,并且该部分将会失败,进而可能导致任务失败。

Root 也很有可能能够发送信号到你的流程。即使你不知何故设法保护您的进程免受任何与用户空间相关的侵害,root仍然能够加载内核模块并破坏内核的努力(也许主动内核锁定除外)。

我知道,nice但我不确定是否给予一个任务(比如长时间运行的占用大量内存的rake任务)最高优先级可以防止它被终止:[...]

它不会阻止它,但它将要用作几种启发式方法的 OOM 杀手。所以,实际上nice价值将要有点帮助。LWN 文章我已经在上面链接的内容给出了以下启发式方法:

  • 如果任务有高于零的好价值,其得分翻倍
  • 超级用户或直接硬件访问任务(CAP_SYS_ADMIN、CAP_SYS_RESOURCE 或 CAP_SYS_RAWIO)的得分除以 4。这是累积的,即具有硬件访问权限的超级用户任务的得分将除以 16。
  • 如果其中一个发生 OOM 情况中央处理器而所检查的任务不属于该集合,其分数除以8。
  • 将得到的分数乘以 2 的 oom_adj 次方(即,当其为正数时,points <<= oom_adj ,否则,points >>= -(oom_adj) )

除了nice值之外,你还可以通过以 root 身份(或使用给定的功能)运行它,或者,如果你 root,你可以确保你的进程不容易被OOM杀手杀死(文章中有详细信息)创建一个 cgroup:

  1. mount -t cgroup -o oom oom /mnt/oom-killer
  2. mkdir /mnt/oom-killer/invincibles
  3. echo 0 > /mnt/oom-killer/invincibles/oom.priority
  4. echo <pid> > /mnt/oom-killer/invincibles/tasks<pid>你的 rake 任务的进程 ID 在哪里……

就这样吧。你可以让某些进程组免受 OOM 终止程序的攻击。

然而,我不确定这种大锤方法是否第一的最好的办法。我认为你应该先进行调整,oom_adj看看这是否有助于你的进程在与其他进程的竞争中生存下来。特别是如果这是一个服务器,整体服务可能比对服务来说可能并不重要的特定任务更重要。因此请谨慎使用。此外,您可能希望监视内存占用(sysstat 和朋友应该会有所帮助)。如果您通过时间序列数据库执行此操作并绘制图表,您甚至可能会发现内存泄漏。

如果这些都不起作用,你应该去布伦丹·格雷格的网站并开始测量不同的性能指标;也可以看看你是否能拿到他的一本书。例如,你的任务中可能确实存在内存分配失控的情况rake。因为你强调长期运行内存密集型但这些不一定有联系。BPF 和朋友们将让你获得你无法通过其他方式获得的见解。

答案3

为什么它会不会被杀死呢?

因为杀死某物并不是自动的。一旦你回答了这个问题,并解释了为什么会选择杀死某物,你也许就能想出解决办法了。

鉴于您谈论的是 Rails 的rake命令,我猜这是一个在服务器上运行的进程。您担心它会被终止,这表明它因使用了过多的资源而被服务器主机终止。在这种情况下,没有(也不应该有)方法阻止您的进程被终止。

如果您有一项资源消耗大的任务,请购买更多资源。使用您自己的服务器时间。或者与主机商达成协议,允许您用他们的钱来运行它。

相关内容