何も私のために働いた!!
そこで、メモリ使用量を監視するスクリプトを作成しました。メモリ消費がしきい値を増やすと、最初にRAMキャッシュをクリアしようとします。スクリプトでこのしきい値を設定できます。それでもメモリ消費量がしきい値を下回らない場合は、メモリ消費量がしきい値を下回るまで、メモリ消費量の降順でプロセスが1つずつ強制終了されます。デフォルトで96%に設定しました。スクリプト内の変数RAM_USAGE_THRESHOLDの値を変更することで構成できます。
大量のメモリを消費するプロセスを強制終了することは完璧な解決策ではありませんが、すべての作業を失うのではなく、1つのアプリケーションを強制終了することをお勧めします。RAMの使用量がしきい値を増やすと、スクリプトはデスクトップ通知を送信します。また、プロセスを強制終了した場合も通知します。
#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()
RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100
def main():
if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
# Clear RAM cache
mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
format(psutil.virtual_memory().percent)
print(mem_warn)
Popen("notify-send \"{}\"".format(mem_warn), shell=True)
print("Clearing RAM Cache")
print(Popen('echo 1 > /proc/sys/vm/drop_caches',
stdout=PIPE, stderr=PIPE,
shell=True).communicate())
post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
psutil.virtual_memory().percent)
Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
print(post_cache_mssg)
if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
print("Clearing RAM cache saved the day")
return
# Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
ps_killed_notify = ""
for i, ps in enumerate(sorted(psutil.process_iter(),
key=lambda x: x.memory_percent(),
reverse=True)):
# Do not kill root
if ps.pid == 1:
continue
elif (i > MAX_NUM_PROCESS_KILL) or \
(psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
messagebox.showwarning('Killed proccess - save_hang',
ps_killed_notify)
Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
return
else:
try:
ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
"} % memory (memory usage={})". \
format(i, ps.name(), ps.pid, ps.memory_percent(),
psutil.virtual_memory().percent)
ps.kill()
time.sleep(1)
ps_killed_mssg += "Current memory usage={}".\
format(psutil.virtual_memory().percent)
print(ps_killed_mssg)
ps_killed_notify += ps_killed_mssg + "\n"
except Exception as err:
print("Error while killing {}: {}".format(ps.pid, err))
else:
print("Memory usage = " + str(psutil.virtual_memory().percent))
root.update()
if __name__ == "__main__":
while True:
try:
main()
except Exception as err:
print(err)
time.sleep(1)
save_hang.pyというファイルにコードを保存します。次のようにスクリプトを実行します。
sudo python save_hang.py
このスクリプトはPython 3のみと互換性があり、tkinterパッケージをインストールする必要があることに注意してください。次のようにインストールできます。
sudo apt-get install python3-tk
お役に立てれば...