fix man; fix CLI input

This commit is contained in:
Alexey Avramov 2019-03-21 02:10:00 +09:00
parent 18a590746a
commit 2f4b89ff51
3 changed files with 143 additions and 18 deletions

View File

@ -117,10 +117,14 @@ $ sudo systemctl enable nohang
``` ```
./nohang -h ./nohang -h
usage: nohang [-h] [-c CONFIG] usage: nohang [-h] [-v] [-t] [--ppt] [-c CONFIG]
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
-v, --version print version
-t, --test print some tests
--ppt, --print-proc-table
print table of processes with their badness values
-c CONFIG, --config CONFIG -c CONFIG, --config CONFIG
path to the config file, default values: path to the config file, default values:
./nohang.conf, /etc/nohang/nohang.conf ./nohang.conf, /etc/nohang/nohang.conf

73
nohang
View File

@ -12,10 +12,14 @@ from signal import SIGKILL, SIGTERM
start_time = time() start_time = time()
help_mess = """usage: nohang [-h] [-c CONFIG] help_mess = """usage: nohang [-h] [-v] [-t] [--ppt] [-c CONFIG]
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
-v, --version print version
-t, --test print some tests
--ppt, --print-proc-table
print table of processes with their badness values
-c CONFIG, --config CONFIG -c CONFIG, --config CONFIG
path to the config file, default values: path to the config file, default values:
./nohang.conf, /etc/nohang/nohang.conf""" ./nohang.conf, /etc/nohang/nohang.conf"""
@ -59,6 +63,18 @@ separate_log = False # will be overwritten after parse config
# define functions # define functions
def func_print_proc_table():
print_proc_table = True
find_victim(print_proc_table)
exit()
def log(*msg): def log(*msg):
""" """
""" """
@ -766,7 +782,7 @@ def pid_to_badness(pid):
return None, None return None, None
def find_victim(): def find_victim(_print_proc_table):
""" """
Find the process with highest badness and its badness adjustment Find the process with highest badness and its badness adjustment
Return pid and badness Return pid and badness
@ -788,7 +804,7 @@ def find_victim():
pid_badness_list = [] pid_badness_list = []
if print_proc_table: if _print_proc_table:
log('==============================================================' log('=============================================================='
'=================') '=================')
log(' PID badness Name eUID cmdline') log(' PID badness Name eUID cmdline')
@ -801,7 +817,7 @@ def find_victim():
if badness is None: if badness is None:
continue continue
if print_proc_table: if _print_proc_table:
log('{} {} {} {} {}'.format( log('{} {} {} {} {}'.format(
pid.rjust(7), pid.rjust(7),
str(badness).rjust(7), str(badness).rjust(7),
@ -828,7 +844,7 @@ def find_victim():
victim_badness = pid_tuple_list[1] victim_badness = pid_tuple_list[1]
victim_name = pid_to_name(pid) victim_name = pid_to_name(pid)
if print_proc_table: if _print_proc_table:
log('============================================================' log('============================================================'
'===================') '===================')
@ -1049,7 +1065,7 @@ def implement_corrective_action(signal):
log(mem_info) log(mem_info)
pid, victim_badness, name = find_victim() pid, victim_badness, name = find_victim(print_proc_table)
if victim_badness >= min_badness: if victim_badness >= min_badness:
@ -1305,12 +1321,15 @@ def calculate_percent(arg_key):
########################################################################## ##########################################################################
print_proc_table_flag = False
# print(len(argv), argv)
if len(argv) == 1: if len(argv) == 1:
if os.path.exists('./nohang.conf'): if os.path.exists('./nohang.conf'):
config = cd = os.getcwd() + '/nohang.conf' config = cd = os.getcwd() + '/nohang.conf'
else: else:
config = '/etc/nohang/nohang.conf' config = '/etc/nohang/nohang.conf'
elif len(argv) == 2: elif len(argv) == 2:
if argv[1] == '--help' or argv[1] == '-h': if argv[1] == '--help' or argv[1] == '-h':
print(help_mess) print(help_mess)
@ -1319,19 +1338,23 @@ elif len(argv) == 2:
print_version() print_version()
elif argv[1] == '--test' or argv[1] == '-t': elif argv[1] == '--test' or argv[1] == '-t':
test() test()
elif argv[1] == '--print-proc-table' or argv[1] == '--ppt':
print_proc_table_flag = True
if os.path.exists('./nohang.conf'):
config = cd = os.getcwd() + '/nohang.conf'
else: else:
errprint('Invalid CLI input') config = '/etc/nohang/nohang.conf'
exit(1)
elif len(argv) > 3:
errprint('Invalid CLI input')
exit(1)
else: else:
errprint('Unknown option: {}'.format(argv[1]))
exit(1)
elif len(argv) == 3:
if argv[1] == '--config' or argv[1] == '-c': if argv[1] == '--config' or argv[1] == '-c':
config = argv[2] config = argv[2]
else: else:
errprint('Invalid option: {}'.format(argv[1])) errprint('Unknown option: {}'.format(argv[1]))
exit(1)
else:
errprint('Invalid CLI input: too many options')
exit(1) exit(1)
@ -1832,6 +1855,21 @@ if max_sleep_time < min_sleep_time:
exit(1) exit(1)
if print_proc_table_flag:
func_print_proc_table()
########################################################################## ##########################################################################
@ -1912,6 +1950,11 @@ else:
########################################################################## ##########################################################################
if print_config: if print_config:
print( print(

View File

@ -1,16 +1,94 @@
.TH nohang 1 .TH nohang 1
.SH NAME .SH NAME
nohang \- no hang daemon
nohang \- A highly configurable OOM preventer
.SH SYNOPSIS .SH SYNOPSIS
.B nohang .B nohang
.RB [ OPTION ]... .RB [ OPTION ]...
.SH DESCRIPTION .SH DESCRIPTION
Nohang is a highly configurable daemon for Linux which is able to correctly prevent out of memory (OOM) and keep system responsiveness in low memory conditions. Nohang is a highly configurable daemon for Linux which is able to correctly prevent out of memory (OOM) and keep system responsiveness in low memory conditions.
.SH REQUIREMENTS
.B For basic usage:
- Linux 3.14+ (since MemAvailable appeared in /proc/meminfo)
- Python 3.3+ (not tested with previous)
.B To show GUI notifications:
- Notification server (most of desktop environments use their own implementations)
- libnotify (Fedora, Arch Linux) or libnotify-bin (Debian GNU/Linux, Ubuntu)
- sudo if nohang started with UID=0
.B To use PSI:
- Linux 4.20+
.SH OPTIONS
-h, --help show this help message and exit
-v, --version print version
-t, --test print some tests
--ppt, --print-proc-table
print table of processes with their badness values
-c CONFIG, --config CONFIG
path to the config file, default values:
./nohang.conf, /etc/nohang/nohang.conf
.SH HOW TO CONFIGURE .SH HOW TO CONFIGURE
Just edit the config /etc/nohang/nohang.conf and restart the daemon.
The program can be configured by editing the config file.
.B The configuration includes the following sections:
- Memory levels to respond to as an OOM threat
- Response on PSI memory metrics
- The frequency of checking the level of available memory (and CPU usage)
- The prevention of killing innocent victims
- Impact on the badness of processes via matching their names, cmdlines and UIDs with regular expressions
- The execution of a specific command or sending any signal instead of sending the SIGTERM signal
- GUI notifications:
- notifications of corrective actions taken
- low memory warnings
- Verbosity
- Misc
Just read the description of the parameters and edit the values.
Please restart nohang to apply the changes.
Default path to the config after installing is /etc/nohang/nohang.conf.
.SH LOGGING
To view the latest entries in the log (for systemd users):
$ sudo journalctl -eu nohang
See also man journalctl.
You can also enable separate_log in the config to logging in /var/log/nohang/nohang.log.
.SH SEE ALSO .SH SEE ALSO
https://github.com/hakavlad/nohang https://github.com/hakavlad/nohang