diff --git a/nohang b/nohang index 7399390..55ed22f 100755 --- a/nohang +++ b/nohang @@ -203,19 +203,24 @@ def pid_to_name(pid): def send_notify_warn(): - title = 'LOW MEMORY' + + fat_tuple = fattest() + if mem_used_zram > 0: - body = 'Mem Available: {} %\nSwap Free: {} %\nMem Used Zram: {} %'.format( + title = 'Low memory: {}% {}% {}%'.format( round(mem_available / mem_total * 100), round(swap_free / (swap_total + 0.1) * 100), round(mem_used_zram / mem_total * 100)) elif swap_free > 0: - body = 'Mem Available: {} %\nSwap Free: {} %'.format( + title = 'Low memory: {}% {}%'.format( round(mem_available / mem_total * 100), round(swap_free / (swap_total + 0.1) * 100)) else: - body = 'Mem Available: {} %'.format( + title = 'Low memory: {}%'.format( round(mem_available / mem_total * 100)) + + body = 'Fattest process: {}, {}'.format(fat_tuple[1], fat_tuple[0]) + if root: # отправляем уведомление всем залогиненным пользователям b = root_notify_env() @@ -231,7 +236,7 @@ def send_notify_warn(): def send_notify(signal, name, pid): - title = 'NOHANG TRIGGERED' + title = 'Preventing OOM' body = '{} process {}, {}'.format( notify_sig_dict[signal], pid, name.replace('&', '*')) if root: @@ -249,7 +254,7 @@ def send_notify(signal, name, pid): def send_notify_etc(pid, name, command): - title = 'NOHANG TRIGGERED' + title = 'Preventing OOM' body = 'Victim is process {}, {}\nExecute the command:\n{}'.format( pid, name.replace('&', '*'), command.replace('&', '*')) if root: @@ -426,6 +431,58 @@ def sleep_after_check_mem(): exit() + +def fattest(): + pid_badness_list = [] + + if regex_matching: + + for pid in os.listdir('/proc'): + if pid[0].isdecimal() is not True: + continue + + try: + badness = int(rline1('/proc/' + pid + '/oom_score')) + name = pid_to_name(pid) + + if fullmatch(avoid_regex, name) is not None: + badness = int(badness / avoid_factor) + + if fullmatch(prefer_regex, name) is not None: + badness = int((badness + 1) * prefer_factor) + + except FileNotFoundError: + badness = 0 + except ProcessLookupError: + badness = 0 + pid_badness_list.append((pid, badness)) + + else: + + for pid in os.listdir('/proc'): + if pid[0].isdecimal() is not True: + continue + try: + badness = int(rline1('/proc/' + pid + '/oom_score')) + except FileNotFoundError: + badness = 0 + except ProcessLookupError: + badness = 0 + pid_badness_list.append((pid, badness)) + + + # получаем отсортированный по badness список пар (pid, badness) + pid_tuple_list = sorted( + pid_badness_list, key=itemgetter(1), reverse=True)[0] + + pid = pid_tuple_list[0] + + name = pid_to_name(pid) + + return (name, pid) + + + ########################################################################## # поиск позиций и mem_total @@ -1273,6 +1330,11 @@ print('Monitoring started!') ########################################################################## + + + + + while True: # find mem_available, swap_total, swap_free @@ -1367,7 +1429,7 @@ while True: if mem_available <= mem_min_sigkill_kb and swap_free <= swap_min_sigkill_kb: time0 = time() - mem_info = 'TRIGGERED!\n MemAvailable ({} MiB, {} %) < mem_min_sigkill ({} MiB, {} %)\n Swa' \ + mem_info = 'Low memory; corrective action required!\n MemAvailable ({} MiB, {} %) < mem_min_sigkill ({} MiB, {} %)\n Swa' \ 'pFree ({} MiB, {} %) < swap_min_sigkill ({} MiB, {} %)'.format( kib_to_mib(mem_available), percent(mem_available / mem_total), @@ -1387,7 +1449,7 @@ while True: elif mem_used_zram >= zram_max_sigkill_kb: time0 = time() - mem_info = 'TRIGGERED!\n MemUsedZram ({} MiB, {} %) > zram_max_sigkill ({} MiB, {} %)'.format( + mem_info = 'Low memory; corrective action required!\n MemUsedZram ({} MiB, {} %) > zram_max_sigkill ({} MiB, {} %)'.format( kib_to_mib(mem_used_zram), percent(mem_used_zram / mem_total), kib_to_mib(zram_max_sigkill_kb), @@ -1400,7 +1462,7 @@ while True: time0 = time() - mem_info = 'TRIGGERED!\n MemAvailable ({} MiB, {} %) < mem_min_sigterm ({} MiB, {} %)\n Sw' \ + mem_info = 'Low memory; corrective action required!\n MemAvailable ({} MiB, {} %) < mem_min_sigterm ({} MiB, {} %)\n Sw' \ 'apFree ({} MiB, {} %) < swap_min_sigterm ({} MiB, {} %)'.format( kib_to_mib(mem_available), percent(mem_available / mem_total), @@ -1425,7 +1487,7 @@ while True: elif mem_used_zram >= zram_max_sigterm_kb: time0 = time() - mem_info = 'TRIGGERED!\n MemUsedZram ({} MiB, {} %) > zram_max_sigter' \ + mem_info = 'Low memory; corrective action required!\n MemUsedZram ({} MiB, {} %) > zram_max_sigter' \ 'm ({} M, {} %)'.format( kib_to_mib(mem_used_zram), percent(mem_used_zram / mem_total),