一个button来设置所有进程保持为Linux?

当Linux开始交换时,你基本注定了。 系统很快就不会对任何input作出反应,而是快乐地交换直到天数结束。

你能想到一个可以保存所有进程的命令,因此(同时)允许你打开一个干净的shell,在这个shell中你可以检查问题的根源,并且杀死所有内存的进程。 (我想这不是件容易的事情,因为内存可能完全被占满了,所以你需要换掉更多的内存来收集打开一个shell的空间,另一方面,所有其他的交换过程都必须停止。)

如果你把这样一个命令绑定到一个热键,那么也许你可以使用它作为一个紧急button,为你节省了很多时间。 任何想法,如果这是可能的呢? 有人试过这样的事吗? 如果可以意识到这将是一个很酷的function:)

魔术SysReq在其他答案中提到,真的是你所有。 如果你只有SSH访问权限,你可以像这样触发SysReq:

# Enable Magic SysReq since most systems default this off echo 1 > /proc/sys/kernel/sysrq #call OOM Killer to try to free up memory echo f > /proc/sysrq-trigger 

制作一个可执行的脚本,并且一旦你注意到这个交换就可以给你一个机会。 如果您有足够的内存来处理临时内存高峰,或者如果在内存不足的情况下使用随机程序,则禁用交换也是一个选项。

在一个相关的说明中,如果你有一个负载快速增长的远程系统,你需要杀死它,你可以使用它来强制重启,而不是干脆closures:

 echo 1 > /proc/sys/kernel/sysrq #Trigger BIOS reset echo b > /proc/sysrq-trigger 

一个(次优的)解决scheme是提供较less的交换。

这个想法是,当你在绝望的时候举起你的手, OOM Killer会踢。

讨论

我在有限的内存机器上使用Linux的经验表明

用于交互式使用

  • graphics用户界面将使用高达100%和几个%的RAM
  • 尽pipe你可能会遇到一些命令行延迟,但使用100%到150%的RAM工作得很好
  • 使用150到175–200%的内存很慢,但足够响应你在命令行上的交互,并智能地杀死不必要的东西。
  • 在上面,即使有耐心,手工修复也是无望的。

一些特殊情况可以让你延长这些限制。 大但很less活动的后台进程将“记忆”在内存中,但只会偶尔活跃起来,所以对可用性问题没有太多的贡献。

无论如何,计划是调整可用的交换,以便一旦机器太忙,你不能合理地用手杀死东西,OOM杀手踢。

这并不是最理想的(尽pipeOOM杀手可以使用多种启发式方法),但很难确定它会select“正确”。

魔术SysRq是最接近你的button,我知道…

从来没有尝试过,但也许:

 killall -SIGSTOP <main commands> 

看到man killall看你如何可以定制你的需求。 一般来说,你可能想要用ulimit来运行进程来控制它们,并用像Nagios这样的东西来监视内存的使用情况(参见gazillion的“对…的监视…”)。

你也可以尝试用nice -20 bash ,你应该得到一个响应式的shell…