与えられた時間にxGiB以上のRAMを消費する場合は、プロセスを終了します。

与えられた時間にxGiB以上のRAMを消費する場合は、プロセスを終了します。

私はソフトウェア開発者であり、不安定なソフトウェアに多くさらされています。私は最近、システムが停止して応答しなくなるまでメモリが漏れる小さなゲームを作成しました。一般的にREISUBは役に立ちますが、時には役に立たないので強制停電をしなければならない場合もあります。

その後、他のプログラムでこれが再び発生したため、一定期間PIDごとに特定の値を超えると、メモリ使用量を監視するスクリプトを作成することでこれを簡単に防ぐことができると思いました。それからSIGKILLを受け取ります。そしてすぐに降りてください。

どんなアイデアがありますか?ありがとう

答え1

earlyoomここにリストされている選択肢の1つをインストールして有効にします。

https://github.com/hakavlad/nohang

Fedoraは現在デフォルトでEarlyoomを使用しています。

LinuxカーネルのOOM処理は非常に悪く、ユーザースペースユーティリティ/ヘルパーなしでは正しく機能しないことがよくあります。

man limits.confcgroupを使用してアプリケーションRAMの使用量を制限することもできます。

答え2

簡単なアイデア:メモリが指定された値を超えていることを確認し、しばらくしてからもう一度確認してください。攻撃して3回連続攻撃すると死亡します。知っておくべきこと:プロセスの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

関連情報