无论如何,有没有什么办法可以防止进程被终止?我知道,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:
mount -t cgroup -o oom oom /mnt/oom-killer
mkdir /mnt/oom-killer/invincibles
echo 0 > /mnt/oom-killer/invincibles/oom.priority
echo <pid> > /mnt/oom-killer/invincibles/tasks
,<pid>
你的 rake 任务的进程 ID 在哪里……
就这样吧。你可以让某些进程组免受 OOM 终止程序的攻击。
然而,我不确定这种大锤方法是否第一的最好的办法。我认为你应该先进行调整,oom_adj
看看这是否有助于你的进程在与其他进程的竞争中生存下来。特别是如果这是一个服务器,整体服务可能比对服务来说可能并不重要的特定任务更重要。因此请谨慎使用。此外,您可能希望监视内存占用(sysstat 和朋友应该会有所帮助)。如果您通过时间序列数据库执行此操作并绘制图表,您甚至可能会发现内存泄漏。
如果这些都不起作用,你应该去布伦丹·格雷格的网站并开始测量不同的性能指标;也可以看看你是否能拿到他的一本书。例如,你的任务中可能确实存在内存分配失控的情况rake
。因为你强调长期运行和内存密集型但这些不一定有联系。BPF 和朋友们将让你获得你无法通过其他方式获得的见解。
答案3
为什么会它会不会被杀死呢?
因为杀死某物并不是自动的。一旦你回答了这个问题,并解释了为什么会选择杀死某物,你也许就能想出解决办法了。
鉴于您谈论的是 Rails 的rake
命令,我猜这是一个在服务器上运行的进程。您担心它会被终止,这表明它因使用了过多的资源而被服务器主机终止。在这种情况下,没有(也不应该有)方法阻止您的进程被终止。
如果您有一项资源消耗大的任务,请购买更多资源。使用您自己的服务器时间。或者与主机商达成协议,允许您用他们的钱来运行它。