fix notifications and output
This commit is contained in:
parent
04b0a374cd
commit
83ac2381c3
82
nohang
82
nohang
@ -203,19 +203,24 @@ def pid_to_name(pid):
|
|||||||
|
|
||||||
|
|
||||||
def send_notify_warn():
|
def send_notify_warn():
|
||||||
title = 'LOW MEMORY'
|
|
||||||
|
fat_tuple = fattest()
|
||||||
|
|
||||||
if mem_used_zram > 0:
|
if mem_used_zram > 0:
|
||||||
body = '<b>Mem Available: {} %\nSwap Free: {} %\nMem Used Zram: {} %</b>'.format(
|
title = 'Low memory: {}% {}% {}%'.format(
|
||||||
round(mem_available / mem_total * 100),
|
round(mem_available / mem_total * 100),
|
||||||
round(swap_free / (swap_total + 0.1) * 100),
|
round(swap_free / (swap_total + 0.1) * 100),
|
||||||
round(mem_used_zram / mem_total * 100))
|
round(mem_used_zram / mem_total * 100))
|
||||||
elif swap_free > 0:
|
elif swap_free > 0:
|
||||||
body = '<b>Mem Available: {} %\nSwap Free: {} %</b>'.format(
|
title = 'Low memory: {}% {}%'.format(
|
||||||
round(mem_available / mem_total * 100),
|
round(mem_available / mem_total * 100),
|
||||||
round(swap_free / (swap_total + 0.1) * 100))
|
round(swap_free / (swap_total + 0.1) * 100))
|
||||||
else:
|
else:
|
||||||
body = '<b>Mem Available: {} %</b>'.format(
|
title = 'Low memory: {}%'.format(
|
||||||
round(mem_available / mem_total * 100))
|
round(mem_available / mem_total * 100))
|
||||||
|
|
||||||
|
body = 'Fattest process: <b>{}</b>, <b>{}</b>'.format(fat_tuple[1], fat_tuple[0])
|
||||||
|
|
||||||
if root:
|
if root:
|
||||||
# отправляем уведомление всем залогиненным пользователям
|
# отправляем уведомление всем залогиненным пользователям
|
||||||
b = root_notify_env()
|
b = root_notify_env()
|
||||||
@ -231,7 +236,7 @@ def send_notify_warn():
|
|||||||
|
|
||||||
|
|
||||||
def send_notify(signal, name, pid):
|
def send_notify(signal, name, pid):
|
||||||
title = 'NOHANG TRIGGERED'
|
title = 'Preventing OOM'
|
||||||
body = '<b>{}</b> process <b>{}</b>, <b>{}</b>'.format(
|
body = '<b>{}</b> process <b>{}</b>, <b>{}</b>'.format(
|
||||||
notify_sig_dict[signal], pid, name.replace('&', '*'))
|
notify_sig_dict[signal], pid, name.replace('&', '*'))
|
||||||
if root:
|
if root:
|
||||||
@ -249,7 +254,7 @@ def send_notify(signal, name, pid):
|
|||||||
|
|
||||||
|
|
||||||
def send_notify_etc(pid, name, command):
|
def send_notify_etc(pid, name, command):
|
||||||
title = 'NOHANG TRIGGERED'
|
title = 'Preventing OOM'
|
||||||
body = 'Victim is process <b>{}</b>, <b>{}</b>\nExecute the command:\n<b>{}</b>'.format(
|
body = 'Victim is process <b>{}</b>, <b>{}</b>\nExecute the command:\n<b>{}</b>'.format(
|
||||||
pid, name.replace('&', '*'), command.replace('&', '*'))
|
pid, name.replace('&', '*'), command.replace('&', '*'))
|
||||||
if root:
|
if root:
|
||||||
@ -426,6 +431,58 @@ def sleep_after_check_mem():
|
|||||||
exit()
|
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
|
# поиск позиций и mem_total
|
||||||
@ -1273,6 +1330,11 @@ print('Monitoring started!')
|
|||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
||||||
# find mem_available, swap_total, swap_free
|
# 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:
|
if mem_available <= mem_min_sigkill_kb and swap_free <= swap_min_sigkill_kb:
|
||||||
time0 = time()
|
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(
|
'pFree ({} MiB, {} %) < swap_min_sigkill ({} MiB, {} %)'.format(
|
||||||
kib_to_mib(mem_available),
|
kib_to_mib(mem_available),
|
||||||
percent(mem_available / mem_total),
|
percent(mem_available / mem_total),
|
||||||
@ -1387,7 +1449,7 @@ while True:
|
|||||||
elif mem_used_zram >= zram_max_sigkill_kb:
|
elif mem_used_zram >= zram_max_sigkill_kb:
|
||||||
time0 = time()
|
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),
|
kib_to_mib(mem_used_zram),
|
||||||
percent(mem_used_zram / mem_total),
|
percent(mem_used_zram / mem_total),
|
||||||
kib_to_mib(zram_max_sigkill_kb),
|
kib_to_mib(zram_max_sigkill_kb),
|
||||||
@ -1400,7 +1462,7 @@ while True:
|
|||||||
|
|
||||||
time0 = time()
|
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(
|
'apFree ({} MiB, {} %) < swap_min_sigterm ({} MiB, {} %)'.format(
|
||||||
kib_to_mib(mem_available),
|
kib_to_mib(mem_available),
|
||||||
percent(mem_available / mem_total),
|
percent(mem_available / mem_total),
|
||||||
@ -1425,7 +1487,7 @@ while True:
|
|||||||
elif mem_used_zram >= zram_max_sigterm_kb:
|
elif mem_used_zram >= zram_max_sigterm_kb:
|
||||||
time0 = time()
|
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(
|
'm ({} M, {} %)'.format(
|
||||||
kib_to_mib(mem_used_zram),
|
kib_to_mib(mem_used_zram),
|
||||||
percent(mem_used_zram / mem_total),
|
percent(mem_used_zram / mem_total),
|
||||||
|
Loading…
Reference in New Issue
Block a user