diff --git a/nohang b/nohang
index c2c8fe4..0fa3faa 100755
--- a/nohang
+++ b/nohang
@@ -9,6 +9,9 @@ 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'}
@@ -43,6 +46,46 @@ name_strip_string = '\'"`\\!-$'
# function definition section
+# return list of tuples with
+# username, DISPLAY and DBUS_SESSION_BUS_ADDRESS
+def root_notify_env():
+
+ ps_output_list = Popen(['ps', 'aue'], stdout=PIPE
+ ).communicate()[0].decode().split('\n')
+
+ di = 'DISPLAY='
+ db = 'DBUS_SESSION_BUS_ADDRESS='
+ us = 'USER='
+ ro = 'root '
+
+ lines_with_displays = []
+ for line in ps_output_list:
+ if di in line and db in line and us in line and not line.startswith(ro):
+ lines_with_displays.append(line)
+
+ # list of tuples with all necessary
+ deus = []
+ for i in lines_with_displays:
+ for i in i.split(' '):
+ if i.startswith(us):
+ user = i.strip('\n').split('=')[1]
+ continue
+ if i.startswith(di):
+ disp_value = i.strip('\n').split('=')[1][0:2]
+ disp = di + disp_value
+ continue
+ if i.startswith(db):
+ dbus = i.strip('\n')
+ deus.append(tuple([user, disp, dbus]))
+
+ # unique list of tuples
+ vult = []
+ for user_env_tuple in set(deus):
+ vult.append(user_env_tuple)
+
+ return vult
+
+
def string_to_float_convert_test(string):
try:
return float(string)
@@ -204,13 +247,20 @@ def send_notify(signal, name, pid, oom_score, vm_rss, vm_swap):
'id: {} \nBadness: {} \nVmRSS: {} MiB \nVmSwap: {} MiB" &'.format(
sig_dict[signal], name.strip(name_strip_string), pid, oom_score, vm_rss, vm_swap)
+
if root:
# отправляем уведомление всем залогиненным пользователям
- for uid in os.listdir('/run/user'):
- root_notify_command = 'sudo -u {} DISPLAY={} notify-send {} "Pr' \
- 'eventing OOM" '.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 = i[0]
+ display_env = i[1]
+ dbus_env = i[2]
+ # su username - -c "env DISPLAY=... DBUS_SESSION_BUS_ADDRESS=... notify-send 'head' 'body'"
+ root_notify_command = 'sudo -u {} {} {} notify-send "Preventing OOM" '.format(
+ username, display_env, dbus_env)
+ os.system(root_notify_command + info)
+
else:
# отправляем уведомление пользователю, который запустил nohang
user_notify_command = 'notify-send {} "Preventing OOM" '.format(