diff --git a/nohang b/nohang
index d1d7cb5..5d65030 100755
--- a/nohang
+++ b/nohang
@@ -277,12 +277,6 @@ def check_mem():
return int(rline1('/proc/meminfo').split(':')[1][:-4])
-def write(text):
- file = '/dev/shm/nohang_notify'
- with open(file, 'w') as f:
- f.write(text)
-
-
def check_mem_and_swap():
"""find mem_available, swap_total, swap_free"""
with open('/proc/meminfo') as f:
@@ -616,13 +610,14 @@ def send_notify_warn():
t0 = time()
- title = 'Low memoy'
+ title = 'Low memory'
body = 'MemAvail: {}%\nSwapFree: {}%'.format(
round(mem_available / mem_total * 100),
round(swap_free / (swap_total + 0.1) * 100)
)
- write('{}\x00{}'.format(title, body))
- os.system(notify_helper_path + ' &')
+
+ send_notification(title, body)
+
t1 = time()
print('t:', t1 - t0)
@@ -647,8 +642,7 @@ def send_notify(signal, name, pid):
)
)
- write('{}\x00{}'.format(title, body))
- os.system(notify_helper_path + ' &')
+ send_notification(title, body)
'''
if root:
@@ -669,16 +663,14 @@ def send_notify_etc(pid, name, command):
pid: str process pid
"""
title = 'Freeze prevention'
- body = 'Victim is {}[{}]\nExecute the command:\n{}'.format(
- name.replace('&', '*'),
+ body = 'Victim is [{}] {}\nExecute the command:\n{}'.format(
pid,
+ name.replace('&', '*'),
command.replace('&', '*')
)
- # write() -> wrinte_notify(title, body)
+ send_notification(title, body)
- write('{}\x00{}'.format(title, body))
- os.system(notify_helper_path + ' &')
'''
if root:
# send notification to all active users with notify-send
@@ -689,6 +681,28 @@ def send_notify_etc(pid, name, command):
'''
+def send_notification(title, body):
+ """
+ """
+ split_by = '#' * 16
+
+ t000 = time()
+
+ path_to_cache = '/dev/shm/nohang_notify_cache_uid{}_time{}'.format(
+ str(self_uid), t000
+ )
+
+ text = '{}{}{}'.format(title, split_by, body)
+
+ with open(path_to_cache, 'w') as f:
+ f.write(text)
+ os.chmod(path_to_cache, 0o600)
+
+ cmd = '{} --uid {} --time {} &'.format(notify_helper_path, self_uid, t000)
+
+ os.system(cmd)
+
+
def sleep_after_send_signal(signal):
"""
Sleeping after signal was sent.
@@ -1176,14 +1190,14 @@ def implement_corrective_action(signal):
y = dick['v']
- print(y[3] - x[3])
+ #print(y[3] - x[3])
if x[0] == y[0] and x[1] == y[1] and x[2] == y[2]:
- print('совпадение имени, пид, сигнала')
+ #print('совпадение имени, пид, сигнала')
# сохр в словаре первре совпавшее время
dt = y[3] - x[3]
- print(dt, 'dt')
+ #print(dt, 'dt')
if dt < delay_after_same_notify:
notif = False
@@ -2132,7 +2146,8 @@ while True:
mem_info = 'PSI avg value ({}) > sigkill_psi_threshold ({})'.format(
psi_avg_value, sigkill_psi_threshold)
- implement_corrective_action(SIGKILL)
+ # implement_corrective_action(SIGKILL)
+ print('implement!')
psi_t0 = time()
continue
@@ -2142,7 +2157,8 @@ while True:
mem_info = 'PSI avg value ({}) > sigterm_psi_threshold ({})'.format(
psi_avg_value, sigterm_psi_threshold)
- implement_corrective_action(SIGTERM)
+ # implement_corrective_action(SIGTERM)
+ print('implement!')
psi_t0 = time()
continue
diff --git a/nohang.conf b/nohang.conf
index 7573acf..6f35675 100644
--- a/nohang.conf
+++ b/nohang.conf
@@ -384,7 +384,6 @@ max_ancestry_depth = 1
separate_log = False
-
psi_debug = False
#####################################################################
diff --git a/nohang.service b/nohang.service
index 2c099d7..a36f3c2 100644
--- a/nohang.service
+++ b/nohang.service
@@ -7,7 +7,7 @@ Documentation=man:nohang(1) https://github.com/hakavlad/nohang
ExecStart=/usr/sbin/nohang --config /etc/nohang/nohang.conf
Slice=nohang.slice
Restart=always
-MemoryMax=50M
+MemoryMax=60M
TasksMax=20
OOMScoreAdjust=-5
Nice=-20
diff --git a/nohang_notify_helper b/nohang_notify_helper
index 5e9b775..99653c4 100755
--- a/nohang_notify_helper
+++ b/nohang_notify_helper
@@ -1,7 +1,21 @@
#!/usr/bin/env python3
-from os import listdir, path
+from os import listdir, path, remove
from subprocess import Popen, TimeoutExpired
+from sys import argv
+
+
+# print('Starting nohang_notify_helper')
+
+# print(argv)
+
+# print(len(argv))
+
+split_by = '#' * 16
+
+uid = argv[2]
+
+t000 = argv[4]
wait_time = 10
@@ -23,7 +37,13 @@ def rfile(path):
return f.read()
-a1, a2 = rfile('/dev/shm/nohang_notify').split('\x00')
+path_to_cache = '/dev/shm/nohang_notify_cache_uid{}_time{}'.format(
+ uid, t000
+)
+
+title, body = rfile(path_to_cache).split(split_by)
+
+remove(path_to_cache)
def re_pid_environ(pid):
@@ -109,7 +129,7 @@ list_len = len(list_with_envs)
if list_len > 0:
for i in list_with_envs:
- print('Send GUI notification:', a1, a2, i)
+ print('Send GUI notification:', title, body, i)
# iterating over logged-in users
for i in list_with_envs:
@@ -127,8 +147,8 @@ if list_len > 0:
'DBUS_SESSION_BUS_ADDRESS=' + dbus_value,
'notify-send',
'--icon=dialog-warning',
- a1,
- a2
+ title,
+ body
]) as proc:
try:
proc.wait(timeout=wait_time)
@@ -140,6 +160,6 @@ if list_len > 0:
else:
print(
'Not send GUI notification: [',
- a1,
- a2,
+ title,
+ body,
']. Nobody logged-in with GUI. Nothing to do.')