diff --git a/README.md b/README.md index 67a19a6..226a9f9 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ The tools listed above may work at the same time on one computer. - cmdlines and - euids with specified regular expressions -- If the name of the victim matches a certain regex pattern, you can run any command instead of sending the SIGTERM signal (the default corrective action) to the victim. For example: +- If the name or cgroup_v1 of the victim matches a certain regex pattern, you can run any command instead of sending the SIGTERM signal (the default corrective action) to the victim. For example: - `sysmemctl restart foo` - `kill -INT $PID` (you can override the signal sent to the victim, $PID will be replaced by the victim's PID) - `kill -TERM $PID && script.sh` (in addition to sending any signal, you can run a specified script) @@ -444,5 +444,6 @@ Please create [issues](https://github.com/hakavlad/nohang/issues). Use cases, fe - [x] Added initial support for `PSI` - [x] Improved user input validation - [x] Improved documentation + - [x] Handle signals - [v0.1](https://github.com/hakavlad/nohang/releases/tag/v0.1), 2018-11-23: Initial release diff --git a/nohang b/nohang index ca91683..11c6bbc 100755 --- a/nohang +++ b/nohang @@ -15,7 +15,6 @@ from sre_constants import error as invalid_re start_time = time() - help_mess = """usage: nohang [-h] [-v] [-t] [-p] [-c CONFIG] optional arguments: @@ -87,16 +86,25 @@ cgroup_v1_index, cgroup_v2_index = find_cgroup_indexes() # define functions +def self_rss(): + """ + """ + return pid_to_status(self_pid)[5] -def signal_handler(sig, frame): - log('Got signal {}'.format(sig)) + +def print_self_rss(): + """ + """ + log('Self RSS: {} MiB'.format(self_rss())) + + +def signal_handler(signum, frame): + log('Got signal {}'.format(signum)) update_stat_dict_and_print(None) log('Exit') - stdout.flush() exit() - def write(path, string): """ """ @@ -621,9 +629,6 @@ def update_stat_dict_and_print(key): """ """ - - - if key is not None: if key not in stat_dict: @@ -635,7 +640,6 @@ def update_stat_dict_and_print(key): new_value = stat_dict[key] + 1 stat_dict.update({key: new_value}) - if print_total_stat: stats_msg = 'Total stat (what happened in the last {}):'.format( @@ -816,7 +820,7 @@ def kib_to_mib(num): def percent(num): - """Interprete mum as percentage.""" + """Interprete num as percentage.""" return round(num * 100, 1) @@ -1194,7 +1198,6 @@ def find_victim(_print_proc_table): ) ) - return pid, victim_badness, victim_name @@ -1677,6 +1680,7 @@ def sleep_after_check_mem(): sleep(t) + def calculate_percent(arg_key): """ parse conf dict @@ -2644,10 +2648,14 @@ if not root: log('WARNING: effective UID != 0; euid={}; processes with other e' 'uids will be invisible for nohang'.format(self_uid)) + +print_self_rss() + + # if print_proc_table: # find_victim(print_proc_table) -log('Monitoring started!') +log('Monitoring has started!') stdout.flush() @@ -2670,15 +2678,10 @@ if print_mem_check_results: report0 = 0 - -signal(SIGTERM, signal_handler) -signal(SIGINT, signal_handler) -signal(SIGQUIT, signal_handler) -signal(SIGHUP, signal_handler) -signal(SIGABRT, signal_handler) -signal(SIGSEGV, signal_handler) -signal(SIGBUS, signal_handler) - +# handle signals +sig_list = [SIGTERM, SIGINT, SIGQUIT, SIGHUP, SIGABRT, SIGSEGV, SIGBUS] +for signum in sig_list: + signal(signum, signal_handler) while True: diff --git a/nohang.service b/nohang.service index 13355e8..37f8d65 100644 --- a/nohang.service +++ b/nohang.service @@ -1,5 +1,5 @@ [Unit] -Description=Highly configurable out of memory preventer +Description=Highly configurable OOM prevention daemon After=sysinit.target Documentation=man:nohang(1) https://github.com/hakavlad/nohang @@ -7,6 +7,10 @@ Documentation=man:nohang(1) https://github.com/hakavlad/nohang ExecStart=/usr/sbin/nohang --config /etc/nohang/nohang.conf Slice=nohang.slice Restart=always +KillMode=mixed +StartLimitBurst=60 +StartLimitInterval=20 +StartLimitIntervalSec=20 MemoryMax=50M TasksMax=50 Nice=-20