Kernel
如果在給定時間內佔用超過 xGiB 的 RAM,則終止程序
我是一名軟體開發人員,接觸過很多不穩定的軟體。最近我做了一個小遊戲,由於某種原因記憶體洩漏,直到系統掛起並且沒有響應。通常,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 使用。