diff --git a/default_values_backup.conf b/default_values_backup.conf index ec50ef8..3e41637 100644 --- a/default_values_backup.conf +++ b/default_values_backup.conf @@ -57,8 +57,6 @@ $ETC proc_name /// some command - low memory warnings gui_notifications = False -notify_options = -root_display = :0 gui_low_memory_warnings = False min_time_between_warnings = 20 mem_min_warnings = 20 % diff --git a/nohang b/nohang index 0e281de..f01505a 100755 --- a/nohang +++ b/nohang @@ -9,7 +9,6 @@ from time import sleep, time from argparse import ArgumentParser from sys import stdout -from subprocess import Popen, PIPE sig_dict = {signal.SIGKILL: 'SIGKILL', signal.SIGTERM: 'SIGTERM'} @@ -204,38 +203,38 @@ def pid_to_name(pid): def send_notify_warn(): - + title = 'LOW MEMORY' if mem_used_zram > 0: - info = '"MemAvailable: {} MiB\nSwapFree: {} MiB\nMemUsedZram: {} MiB" &'.format( + body = 'Mem Available: {} MiB\nSwap Fre' \ + 'e: {} MiB\nMemUsedZram: {} MiB'.format( kib_to_mib(mem_available), kib_to_mib(swap_free), kib_to_mib(mem_used_zram)) elif swap_free > 0: - info = '"MemAvailable: {} MiB\nSwapFree:' \ - ' {} MiB" &'.format( + body = 'Mem Available: {} MiB\nSwap Free:' \ + ' {} MiB'.format( kib_to_mib(mem_available), kib_to_mib(swap_free)) else: - info = '"MemAvailable: {} MiB, {} %" &'.format( - kib_to_mib(mem_available), - round(mem_available / mem_total * 100, 1)) - + body = 'Mem Available: {} %'.format( + #kib_to_mib(mem_available), + round(mem_available / mem_total * 100)) if root: - # отправляем уведомления всем залогиненным - for uid in os.listdir('/run/user'): - root_notify_command = 'sudo -u {} DISPLAY={} notify-s' \ - 'end {} "Warning: Low Memory" '.format( - users_dict[uid], root_display, notify_options) - os.system(root_notify_command + info) + # отправляем уведомление всем залогиненным пользователям + b = root_notify_env() + if len(b) > 0: + for i in b: + username, display_env, dbus_env = i[0], i[1], i[2] + Popen(['sudo', '-u', username, 'env', display_env, + dbus_env, 'notify-send', '--icon=dialog-warning', + '{}'.format(title), '{}'.format(body)]) else: # отправляем уведомление пользователю, который запустил nohang - user_notify_command = 'notify-send {} "Warning: Low Memory" '.format( - notify_options) - os.system(user_notify_command + info) + Popen(['notify-send', '--icon=dialog-warning', '{}'.format(title), '{}'.format(body)]) def send_notify(signal, name, pid, oom_score, vm_rss, vm_swap): - head = 'Preventing OOM' + title = 'Nohang TRIGGERED' body = 'Nohang sent {} \nto the process {} \nP' \ 'id: {} \nBadness: {} \nVmRSS: {} MiB \nVmSwap: {} MiB'.format( @@ -248,10 +247,10 @@ def send_notify(signal, name, pid, oom_score, vm_rss, vm_swap): username, display_env, dbus_env = i[0], i[1], i[2] Popen(['sudo', '-u', username, 'env', display_env, dbus_env, 'notify-send', '--icon=dialog-warning', - '{}'.format(head), '{}'.format(body)]) + '{}'.format(title), '{}'.format(body)]) else: # отправляем уведомление пользователю, который запустил nohang - Popen(['notify-send', '{}'.format(head), '{}'.format(body)]) + Popen(['notify-send', '--icon=dialog-warning', '{}'.format(title), '{}'.format(body)]) def sleep_after_send_signal(signal): @@ -365,26 +364,22 @@ def find_victim_and_send_signal(signal): else: - try: # SUCCESS -> RESPONSE TIME + try: # delta_sucess -> response_time os.kill(int(pid), signal) - - success_time = time() - delta_success = success_time - time0 + delta_success = time() - time0 send_result = 'signal received; response time: {} ms'.format(round(delta_success * 1000)) if gui_notifications: send_notify(signal, name, pid, oom_score, vm_rss, vm_swap) except FileNotFoundError: - success_time = time() - delta_success = success_time - time0 + delta_success = time() - time0 send_result = 'no such process; response time: {} ms'.format(round(delta_success * 1000)) except ProcessLookupError: - success_time = time() - delta_success = success_time - time0 + delta_success = time() - time0 send_result = 'no such process; response time: {} ms'.format(round(delta_success * 1000)) - preventing_oom_message = ' Finding the process with the highest badness\n Victim is {}, pid: {}, badness: {}, VmRSS: {} MiB, VmSwap: {} MiB\n Sending {} to the victim; {}'.format(name, pid, oom_score, vm_rss, vm_swap, sig_dict[signal], send_result) + preventing_oom_message = ' Finding the process with the highest badness\n Victim is {}, pid: {}, badness: {}, VmRSS: {} MiB, VmSwap: {} MiB\n Sending {} to the victim; {}'.format(name, pid, oom_score, vm_rss, vm_swap, sig_dict[signal], send_result) print(preventing_oom_message) @@ -907,13 +902,7 @@ if 'gui_notifications' in config_dict: gui_notifications = config_dict['gui_notifications'] if gui_notifications == 'True': gui_notifications = True - users_dict = dict() - with open('/etc/passwd') as f: - for line in f: - line_list = line.split(':') - username = line_list[0] - uid = line_list[2] - users_dict[uid] = username + from subprocess import Popen, PIPE elif gui_notifications == 'False': gui_notifications = False else: @@ -926,11 +915,8 @@ else: exit() -notify_options = conf_parse_string('notify_options') -root_display = conf_parse_string('root_display') - regex_matching = conf_parse_bool('regex_matching') if regex_matching: @@ -1392,7 +1378,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 = 'TRIGGERED!\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), @@ -1412,7 +1398,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 = 'TRIGGERED!\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), @@ -1425,7 +1411,7 @@ while True: time0 = time() - mem_info = 'TRIGGERED!\n MemAvailable ({} MiB, {} %) < mem_min_sigterm ({} MiB, {} %)\n Sw' \ + mem_info = 'TRIGGERED!\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), @@ -1450,7 +1436,7 @@ while True: elif mem_used_zram >= zram_max_sigterm_kb: time0 = time() - mem_info = 'TRIGGERED!\n MemUsedZram ({} MiB, {} %) > zram_max_sigter' \ + mem_info = 'TRIGGERED!\n MemUsedZram ({} MiB, {} %) > zram_max_sigter' \ 'm ({} M, {} %)'.format( kib_to_mib(mem_used_zram), percent(mem_used_zram / mem_total), @@ -1476,3 +1462,4 @@ while True: else: stdout.flush() sleep_after_check_mem() + diff --git a/nohang.conf b/nohang.conf index 9ec96f6..784ff10 100644 --- a/nohang.conf +++ b/nohang.conf @@ -201,21 +201,6 @@ $ETC proc_name /// some command gui_notifications = False - Additional options for notify-send. - See `notify-send --help` and read `man notify-send` - For example: - notify_options = -u "critical" - notify_options = -t "20000" -i "dialog-warning" - -notify_options = - - Переменая окружения $DISPLAY, передаваемая notify-send при - запуске nohang с uid = 0. - Должен совпадать с выводом - $ echo $DISPLAY - -root_display = :0 - Enable GUI notifications about the low level of available memory. Для работы опции должны быть включены десктопные уведомления. Valid values are True and False.