Kernel

如果在給定時間內佔用超過 xGiB 的 RAM,則終止程序

  • January 28, 2021

我是一名軟體開發人員,接觸過很多不穩定的軟體。最近我做了一個小遊戲,由於某種原因記憶體洩漏,直到系統掛起並且沒有響應。通常,REISUB 會有所幫助,但有時甚至沒有,您需要進行硬關機。

然後它在另一個程序中再次發生在我身上,所以我心想,這可以通過編寫一個監視記憶體使用情況的腳本來輕鬆防止,如果它在一定時間內超過每個 PID 的某個值,它會得到一個 SIGKILL 到立即將其取下。

有任何想法嗎?謝謝

簡單的想法:檢查記憶體是否超過給定值,並在一段時間後再次檢查。分發罷工,連續三次罷工將導致死亡。需要知道:程序的PID

#!/bin/bash
pid=$1
strike=0

#as long as process exists
while (kill -0 $pid 2>/dev/null) ; do
 #get RAM usage in kB
 ram=$(pmap -x $pid | tail -1 | awk '{print $3}')
 #compare to threshold, 1,000,000kB
 if [[ 1000000 -lt $ram ]] ; then
   strike=$((strike+1))
   if [[ strike -eq 3 ]] ; then
      kill $pid
      exit
   fi
 else
   strike=0
 fi
 sleep 5
done

請安裝earlyoom並啟用此處列出的任何替代方案:

https://github.com/hakavlad/nohang

現在 Fedora 預設使用 earlyoom。

Linux 核心 OOM 處理非常糟糕,而且通常在沒有使用者空間實用程序/幫助程序的情況下無法正常工作。

您還可以使用man limits.conf和 cgroups 來限制您的應用程序 RAM 使用。

引用自:https://unix.stackexchange.com/questions/631427