diff --git a/README.md b/README.md index 7f0afba..d23d1c5 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,12 @@ OOM killer doesn't prevent OOM conditions. ### Some features -- convenient configuration with a well commented config file (there are 38 parameters in the config) +- convenient configuration with a well commented config file (there are 35 parameters in the config) - `SIGKILL` and `SIGTERM` as signals that can be sent to the victim - `zram` support (`mem_used_total` as a trigger) - customizable intensity of monitoring - desktop notifications: results of preventings OOM and low memory warnings -- black, white, prefer, avoid lists via regex +- prefer and avoid lists via regex matching - possibility of restarting processes via command like `systemctl restart something` if the process is selected as a victim - look at the [config](https://github.com/hakavlad/nohang/blob/master/nohang.conf) to find more @@ -32,34 +32,11 @@ OOM killer doesn't prevent OOM conditions. ### An example of output ``` -MemAvail: 2976 M, 50.6 % | SwapFree: 10758 M, 100.0 % -MemAvail: 0 M, 0.0 % | SwapFree: 10281 M, 95.6 % -MemAvail: 0 M, 0.0 % | SwapFree: 9918 M, 92.2 % -MemAvail: 0 M, 0.0 % | SwapFree: 8659 M, 80.5 % -MemAvail: 0 M, 0.0 % | SwapFree: 7235 M, 67.3 % -MemAvail: 19 M, 0.3 % | SwapFree: 6851 M, 63.7 % -MemAvail: 0 M, 0.0 % | SwapFree: 5780 M, 53.7 % -MemAvail: 0 M, 0.0 % | SwapFree: 5008 M, 46.6 % -MemAvail: 0 M, 0.0 % | SwapFree: 4199 M, 39.0 % -MemAvail: 0 M, 0.0 % | SwapFree: 3502 M, 32.6 % -MemAvail: 0 M, 0.0 % | SwapFree: 2929 M, 27.2 % -MemAvail: 0 M, 0.0 % | SwapFree: 2446 M, 22.7 % -MemAvail: 0 M, 0.0 % | SwapFree: 2093 M, 19.5 % -MemAvail: 0 M, 0.0 % | SwapFree: 1573 M, 14.6 % -MemAvail: 0 M, 0.0 % | SwapFree: 1320 M, 12.3 % -MemAvail: 0 M, 0.0 % | SwapFree: 1117 M, 10.4 % -MemAvail: 0 M, 0.0 % | SwapFree: 943 M, 8.8 % - -2018-07-06 Fri 03:04:37 MemAvailable (0 MiB, 0.0 %) < mem_min_sigterm (588 MiB, 10.0 %) SwapFree (943 MiB, 8.8 %) < swap_min_sigterm (1076 MiB, 10.0 %) Preventing OOM: trying to send the SIGTERM signal to tail, Pid: 14636, Badness: 777, VmRSS: 4446 MiB, VmSwap: 8510 MiB Success -MemAvail: 173 M, 2.9 % | SwapFree: 3363 M, 31.3 % -MemAvail: 4700 M, 80.0 % | SwapFree: 8986 M, 83.5 % -MemAvail: 4668 M, 79.4 % | SwapFree: 8997 M, 83.6 % -MemAvail: 4610 M, 78.5 % | SwapFree: 9024 M, 83.9 % ``` ### Requirements @@ -117,11 +94,10 @@ The program can be configured by editing the [config file](https://github.com/ha - PREVENTION OF KILLING INNOCENT VICTIMS - AVOID AND PREFER VICTIM NAMES VIA REGEX - EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL -- DESKTOP NOTIFICATIONS +- GUI NOTIFICATIONS - LOW MEMORY WARNINGS -- SELF-DEFENSE +- SELF-DEFENSE AND PREVENTING SLOWING DOWN THE PROGRAM - OUTPUT VERBOSITY -- LOGGING TO SEPARATE FILE Just read the description of the parameters and edit the values. Run the command `sudo systemctl restart nohang` to apply changes. Default path to the config arter installing via `./install.sh` is `/etc/nohang/nohang.conf`. diff --git a/install.sh b/install.sh index 03093dc..7c9b7c7 100755 --- a/install.sh +++ b/install.sh @@ -15,12 +15,6 @@ cp nohang.1.gz /usr/local/share/man/man1/ chmod 644 /usr/local/share/man/man1/nohang.1.gz rm nohang.1.gz -mkdir /var/log/nohang -chmod 750 /var/log/nohang - -cp nohang.logrotate /etc/logrotate.d/nohang -chmod 644 /etc/logrotate.d/nohang - cp nohang.service /etc/systemd/system/ chmod 644 /etc/systemd/system/nohang.service systemctl daemon-reload diff --git a/nohang b/nohang index 5a360b4..e6797da 100755 --- a/nohang +++ b/nohang @@ -5,8 +5,8 @@ import os from operator import itemgetter from time import sleep, time -import datetime from argparse import ArgumentParser +from subprocess import Popen sig_dict = {9: 'SIGKILL', 15: 'SIGTERM'} @@ -110,20 +110,6 @@ def write(path, string): f.write(string) -def append_log(string): - try: - with open(logfile, 'a') as f: - f.write(string + '\n') - except PermissionError: - print( - ' Cannot append log {}: PermissionError'.format( - logfile)) - except IsADirectoryError: - print( - ' Cannot append log {}: IsADirectoryError'.format( - logfile)) - - def kib_to_mib(num): return round(num / 1024.0) @@ -228,25 +214,6 @@ def send_notify(signal, name, pid, oom_score, vm_rss, vm_swap): os.system(user_notify_command + info) -def send_notify_black(signal, name, pid): - # текст отправляемого уведомления - info = '"Nohang sent {}\nto blacklisted proce' \ - 'ss {}, Pid {}" &'.format( - sig_dict[signal], name, pid) - 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) - else: - # отправляем уведомление пользователю, который запустил nohang - user_notify_command = 'notify-send {} "Preventing OOM" '.format( - notify_options) - os.system(user_notify_command + info) - - def sleep_after_send_signal(signal): if signal is 9: if print_sleep_periods: @@ -260,6 +227,9 @@ def sleep_after_send_signal(signal): def find_victim_and_send_signal(signal): + print('****') + print(mem_info) + # выставляем потолок для oom_score_adj всех процессов if decrease_oom_score_adj and root: func_decrease_oom_score_adj(oom_score_adj_max) @@ -269,9 +239,6 @@ def find_victim_and_send_signal(signal): if use_regex_lists: - # pid list, rename var! blacklisted_pids - oom_blacklist_regex = [] - for pid in os.listdir('/proc'): if pid.isdigit() is not True: continue @@ -280,20 +247,6 @@ def find_victim_and_send_signal(signal): oom_score = int(rline1('/proc/' + pid + '/oom_score')) name = pid_to_name(pid) - # если имя в белом списке,то пропускаем - res = fullmatch(whitelist_regex, name) - if res is not None: - print(' {} (Pid: {}) matches with whitelist_regex'.format(name, pid)), - continue - - # если имя в черном списке - добавляем Pid в список для убийства - # ДОБАВЛЯТЬ И ИМЯ СРАЗУ - # ВАРИАНТ - СРАЗУ УБИВАТЬ - res = fullmatch(blacklist_regex, name) - if res is not None: - oom_blacklist_regex.append(pid) - print(' {} (Pid: {}) matches with blacklist_regex'.format(name, pid)), - res = fullmatch(avoidlist_regex, name) if res is not None: # тут уже получаем badness @@ -311,35 +264,6 @@ def find_victim_and_send_signal(signal): oom_score = 0 oom_list.append((pid, oom_score)) - - # если найден хоть один в черном списке - нет смысла сравнивать с остальными - - if oom_blacklist_regex != []: - - for pid in oom_blacklist_regex: - - name = pid_to_name(pid) - print(' Preventing OOM: trying to send the {} signal to blacklisted process {}, Pid: {}'.format( - sig_dict[signal], name, pid)) - - try: - os.kill(int(pid), signal) - print(' Success') - - if desktop_notifications: - send_notify_black(signal, name, pid) - - except FileNotFoundError: - print(' No such process') - except ProcessLookupError: - print(' No such process') - except PermissionError: - print(' Operation not permitted') - - # после отправки сигнала процессам из черного списка поспать и выйти из функции - sleep_after_send_signal(signal) - return 0 - else: # not use regex @@ -354,14 +278,12 @@ def find_victim_and_send_signal(signal): oom_score = 0 oom_list.append((i, oom_score)) - # получаем отсортированный по oom_score (по badness!) список пар (pid, oom_score) pid_tuple_list = sorted(oom_list, key=itemgetter(1), reverse=True)[0] # получаем максимальный oom_score oom_score = pid_tuple_list[1] - if oom_score >= oom_score_min: # пытаемся отправить сигнал найденной жертве @@ -392,13 +314,12 @@ def find_victim_and_send_signal(signal): vm_rss = 0 vm_swap = 0 - if name in etc_dict and signal is 15: command = etc_dict[name] etc_info = ' Process {} is a victim,\n Pid: {}, Badness: {}, VmRSS: {} MiB, VmSwap: {} MiB\n Execute command: {}'.format(name, pid, oom_score, vm_rss, vm_swap, command) + os.system(etc_dict[name]) # все норм, это произвольная команда задана юзером print(etc_info) - os.system(etc_dict[name]) - append_log(etc_info) + # еще ГУИ уведомление запустить else: @@ -414,25 +335,11 @@ def find_victim_and_send_signal(signal): except ProcessLookupError: send_result = ' No such process' - - time_now_and_mem_info = datetime.datetime.today().strftime( - '\n%Y-%m-%d %a %H:%M:%S\n{}'.format(mem_info)) - - print(time_now_and_mem_info) - - if logging: - append_log(time_now_and_mem_info) - try_to_send = ' Preventing OOM: trying to send the {} signal to {},\n Pid: {}, Badness: {}, VmRSS: {} MiB, VmSwap: {} MiB'.format(sig_dict[signal], name, pid, oom_score, vm_rss, vm_swap) print(try_to_send) - - print(send_result) - if logging: - append_log(try_to_send + '\n' + send_result) - else: badness_is_too_small = ' oom_score {} < oom_score_min {}'.format( @@ -440,9 +347,6 @@ def find_victim_and_send_signal(signal): print(badness_is_too_small) - if logging: - append_log(badness_is_too_small) - sleep_after_send_signal(signal) @@ -611,6 +515,23 @@ print_mem_check_results = conf_parse_bool('print_mem_check_results') print_sleep_periods = conf_parse_bool('print_sleep_periods') +realtime_ionice = conf_parse_bool('realtime_ionice') + + +if 'realtime_ionice_classdata' in config_dict: + realtime_ionice_classdata = string_to_int_convert_test( + config_dict['realtime_ionice_classdata']) + if realtime_ionice_classdata is None: + print('Invalid realtime_ionice_classdata value, not integer\nExit') + exit() + if realtime_ionice_classdata < 0 or realtime_ionice_classdata > 7: + print('Invalid realtime_ionice_classdata value\nExit') + exit() +else: + print('realtime_ionice_classdata not in config\nExit') + exit() + + mlockall = conf_parse_bool('mlockall') @@ -952,12 +873,6 @@ if use_regex_lists: from re import fullmatch -whitelist_regex = conf_parse_string('whitelist_regex') - - -blacklist_regex = conf_parse_string('blacklist_regex') - - preferlist_regex = conf_parse_string('preferlist_regex') @@ -990,11 +905,8 @@ else: exit() -logging = conf_parse_bool('logging') -logfile = conf_parse_string('logfile') - low_memory_warnings = conf_parse_bool('low_memory_warnings') @@ -1190,7 +1102,11 @@ else: mla_res = '' -if os.geteuid() == 0: +self_uid = os.geteuid() +self_pid = os.getpid() + + +if self_uid == 0: root = True decrease_res = 'OK' else: @@ -1198,6 +1114,15 @@ else: decrease_res = 'Impossible' +if root and realtime_ionice: + os.system('ionice -c 1 -n {} -p {}'.format( + realtime_ionice_classdata ,self_pid)) + print('\nionice:'.format()) + os.system('ionice') + print() + + + ########################################################################## @@ -1258,18 +1183,11 @@ if print_config: print('\nVII. AVOID AND PREFER VICTIM NAMES VIA REGEX') print('use_regex_lists: {}'.format(use_regex_lists)) if use_regex_lists: - print('whitelist_regex: {}'.format(whitelist_regex)) - print('blacklist_regex: {}'.format(blacklist_regex)) print('preferlist_regex: {}'.format(preferlist_regex)) print('preferlist_factor: {}'.format(preferlist_factor)) print('avoidlist_regex: {}'.format(avoidlist_regex)) print('avoidlist_factor: {}'.format(avoidlist_factor)) - print('\nVIII. LOGGING') - print('logging: {}'.format(logging)) - if logging: - print('logfile: {}'.format(logfile)) - print('\nIX. LOW MEMORY WARNINGS') print('low_memory_warnings: {}'.format(low_memory_warnings)) if low_memory_warnings: diff --git a/nohang.conf b/nohang.conf index dbb809b..567ee32 100644 --- a/nohang.conf +++ b/nohang.conf @@ -5,98 +5,22 @@ The configuration includes the following sections: - I. STANDARD OUTPUT VERBOSITY - II. SELF-DEFENSE - III. INTENSITY OF MONITORING - IV. THRESHOLDS FOR SENDING SIGNALS - V. PREVENTION OF KILLING INNOCENT VICTIMS - VI. DESKTOP NOTIFICATIONS - VII. AVOID AND PREFER VICTIM NAMES VIA REGEX - VIII. LOGGING - IX. LOW MEMORY WARNINGS - X. EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL + * THRESHOLDS FOR SENDING SIGNALS + * INTENSITY OF MONITORING (AND CPU USAGE) + * PREVENTION OF KILLING INNOCENT VICTIMS + * AVOID AND PREFER VICTIM NAMES VIA REGEX + * EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL + * GUI NOTIFICATIONS + * LOW MEMORY WARNINGS + * SELF-DEFENSE AND PREVENTING SLOWING DOWN THE PROGRAM + * OUTPUT VERBOSITY Just read the description of the parameters and edit the values. Please restart the program after editing the config. ##################################################################### - I. STANDARD OUTPUT VERBOSITY - - Display the configuration when the program starts. - Valid values are True and False. - Values are case sensitive! - -print_config = True - - Print memory check results or not print. - Valid values are True and False. - -print_mem_check_results = True - - Print sleep periods between memory checks or not print. - Valid values are True and False. - -print_sleep_periods = False - -##################################################################### - - II. SELF-DEFENSE - - True - заблокировать процесс в памяти для запрета его своппинга. - False - не блокировать. Значения чувствительны к регистру! - - В Fedora 28 значение True вызывает увеличение потребления - памяти процессом на 200 MiB, в Debian 8 и 9 такой проблемы нет. - -mlockall = False - - Установка отрицательных значений self_nice и self_oom_score_adj - требует наличия root прав. - - Установка отрицательного self_nice повышает приоритет процесса. - - Valid values are integers from the range [-20; 19]. - -self_nice = -10 - - Set oom_score_adj for the process. - Valid values are integers from the range [-1000; 1000]. - Setting the values to -1000 will prohibit suicide. - -self_oom_score_adj = -100 - -##################################################################### - - III. INTENSITY OF MONITORING - - Coefficients that affect the intensity of monitoring. Reducing - the coefficients can reduce CPU usage and increase the periods - between memory checks. - - Почему три коэффициента, а не один? - Потому что скорость - наполнения свопа обычно ниже скорости наполнения RAM. - Можно для свопа задать более низкую интенсивность - мониторинга без ущерба для предотвращения нехватки памяти - и тем самым снизить нагрузку на процессор. - - В дефолтных настройках на данной интенсивности демон работает - достаточно хорошо, успешно справляясь с резкими скачками потребления - памяти. - - Default values are well for desktop. - On servers without rapid fluctuations in memory level, the - values can be reduced. - - Valid values are positive floating-point numbers. - -rate_mem = 6 -rate_swap = 3 -rate_zram = 1 - -##################################################################### - - IV. THRESHOLDS FOR SENDING SIGNALS + I. THRESHOLDS FOR SENDING SIGNALS Sets the available memory levels below which SIGTERM or SIGKILL signals are sent. The signal will be sent if MemAvailable and @@ -123,7 +47,35 @@ zram_max_sigkill = 60 % ##################################################################### - V. PREVENTION OF KILLING INNOCENT VICTIMS + II. INTENSITY OF MONITORING + + Coefficients that affect the intensity of monitoring. Reducing + the coefficients can reduce CPU usage and increase the periods + between memory checks. + + Почему три коэффициента, а не один? - Потому что скорость + наполнения свопа обычно ниже скорости наполнения RAM. + Можно для свопа задать более низкую интенсивность + мониторинга без ущерба для предотвращения нехватки памяти + и тем самым снизить нагрузку на процессор. + + В дефолтных настройках на данной интенсивности демон работает + достаточно хорошо, успешно справляясь с резкими скачками потребления + памяти. + + Default values are well for desktop. + On servers without rapid fluctuations in memory level, the + values can be reduced. + + Valid values are positive floating-point numbers. + +rate_mem = 4 +rate_swap = 2 +rate_zram = 1 + +##################################################################### + + III. PREVENTION OF KILLING INNOCENT VICTIMS Минимальное значение oom_score, которым должен обладать процесс для того, чтобы ему был отправлен сигнал. @@ -162,7 +114,73 @@ oom_score_adj_max = 20 ##################################################################### - VI. DESKTOP NOTIFICATIONS + IV. AVOID AND PREFER VICTIM NAMES VIA REGEX + + Можно задать регулярные выражения (Perl-compatible regular + expressions), которые будут использоваться для сопоставления с + именами процессов для влияния на их badness. + + Включение этой опции замедляет поиск жертвы, так как + имена всех процессов сравниваются с заданными regex-паттернами. + + Valid values are True and False. + +use_regex_lists = False + + Badness процессов, имена которых соответствуют preferlist_regex, + будут рассчитываться по формуле + badness = (oom_score + 1) * preferlist_factor + +preferlist_regex = tail|python3 + + Valid values are floating-point numbers from the range [1; 1000]. + +preferlist_factor = 3 + + Список нежелательных для убийства процессов. + + Badness процессов, имена которых соответствуют avoidlist_regex, + будут рассчитываться по формуле + badness = oom_score / avoidlist_factor + +avoidlist_regex = Xorg|sshd + + Valid values are floating-point numbers from the range [1; 1000]. + +avoidlist_factor = 4 + +##################################################################### + + V. EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL + + Для процессов с определенным именем можно задать команду, + которая будет выполняться вместо отправки сигнала SIGTERM + процессу с соответствующим именем. + + Например, если процесс запущен как демон, то вместо + отправки SIGTERM можно выполнить команду перезапуска. + + Valid values are True and False. + +execute_the_command = False + + Длина имени процесса не должна превышать 15 символов. + Синтаксис таков: строки, начинающиеся с **, считаются строками, + содержащими имена процессов и соотвестствующие команды для + перезапуска этих процессов. После имени процесса через двойное + двоеточие (::) следует команда. + Амперсанд (&) в конце команды позволит nohang продолжить работу + не дожидаясь окончания выполнения команды. + + For example: + ** mysqld :: systemctl restart mariadb.service & + ** php-fpm7.0 :: systemctl restart php7.0-fpm.service & + +** processname :: some command + +##################################################################### + + VI. GUI NOTIFICATIONS Включение этой опции требует наличия notify-send в системе. В Debian/Ubuntu это обеспечивается установкой пакета @@ -192,79 +210,11 @@ root_display = :0 ##################################################################### - VII. AVOID AND PREFER VICTIM NAMES VIA REGEX - - Можно задать регулярные выражения (Perl-compatible regular - expressions), которые будут использоваться для сопоставления с - именами процессов для влияния на их badness. - - Включение этой опции замедляет поиск жертвы, так как - имена всех процессов сравниваются с заданными regex-паттернами. - - Valid values are True and False. - -use_regex_lists = False - - Приоритет списков (если один процесс находится одновременно в - нескольких): - 1. whitelist_regex: сначала пропуск процессов из белого списка; - 2. blacklist_regex: отправка сигнала всем из черного списка; - 3. preferlist_regex и avoidlist_regex: умножение или деление - oom_score на соответствующие факторы. - - Процессы, имена которых соответствуют выражению - whitelist_regex, не получат сигнал. - - Регулярное выражение для формирования белого списка. - -whitelist_regex = sshd - - При нехватке памяти все процессы, имена которых соответствуют - blacklist_regex, получат сигнал. - -blacklist_regex = - - Badness процессов, имена которых соответствуют preferlist_regex, - будут рассчитываться по формуле - badness = (oom_score + 1) * preferlist_factor - -preferlist_regex = tail|python3|someprocessname - - Valid values are floating-point numbers from the range [1; 1000]. - -preferlist_factor = 3 - - Список нежелательных для убийства процессов. - - Badness процессов, имена которых соответствуют avoidlist_regex, - будут рассчитываться по формуле - badness = oom_score / avoidlist_factor - -avoidlist_regex = Xorg - - Valid values are floating-point numbers from the range [1; 1000]. - -avoidlist_factor = 3 - -##################################################################### - - VIII. LOGGING - - OOM prevention progress can be logged. - - Valid values are True and False. - -logging = True - -logfile = /var/log/nohang/nohang.log - -##################################################################### - - IX. LOW MEMORY WARNINGS + VII. LOW MEMORY WARNINGS Десктопные уведомления о низком уровне доступной памяти. Для работы опции должны быть включены десктопные уведомления. - Возможно стоит этот раздел объединить с DESKTOP NOTIFICATIONS. + Возможно стоит этот раздел объединить с GUI NOTIFICATIONS. Valid values are True and False. @@ -293,30 +243,62 @@ zram_max_warnings = 40 % ##################################################################### - X. EXECUTE THE COMMAND INSTEAD OF SENDING THE SIGTERM SIGNAL + VIII. SELF-DEFENSE AND PREVENTING SLOWING DOWN THE PROGRAM - Для процессов с определенным именем можно задать команду, - которая будет выполняться вместо отправки сигнала SIGTERM - процессу с соответствующим именем. + True - заблокировать процесс в памяти для запрета его своппинга. + False - не блокировать. - Например, если процесс запущен как демон, то вместо - отправки SIGTERM можно выполнить команду перезапуска. + В Fedora 28 значение True вызывает увеличение потребления + памяти процессом на 200 MiB, в Debian 8 и 9 такой проблемы нет. +mlockall = False + + Установка отрицательных значений self_nice и self_oom_score_adj + требует наличия root прав. + + Установка отрицательного self_nice повышает приоритет процесса. + + Valid values are integers from the range [-20; 19]. + +self_nice = -15 + + # -> niceness + + Set oom_score_adj for the process. + Valid values are integers from the range [-1000; 1000]. + Setting the values to -1000 will prohibit suicide. + +self_oom_score_adj = -100 + + Read `man ionice` to understand the following parameters. + Setting the True value requires the root privileges. + +realtime_ionice = True + + 'For realtime and best-effort, 0-7 are valid data + (priority levels), and 0 represents the highest priority level.' + - `man ionice` + Valid values are integers from the range [0; 7]. + +realtime_ionice_classdata = 5 + +##################################################################### + + IX. STANDARD OUTPUT VERBOSITY + + Display the configuration when the program starts. + Valid values are True and False. + Values are case sensitive! + +print_config = False + + Print memory check results or not print. Valid values are True and False. -execute_the_command = False +print_mem_check_results = False - Длина имени процесса не должна превышать 15 символов. - Синтаксис таков: строки, начинающиеся с **, считаются строками, - содержащими имена процессов и соотвестствующие команды для - перезапуска этих процессов. После имени процесса через двойное - двоеточие (::) следует команда. - Амперсанд (&) в конце команды позволит nohang продолжить работу - не дожидаясь окончания выполнения команды. + Print sleep periods between memory checks or not print. + Valid values are True and False. - For example: - ** mysqld :: systemctl restart mariadb.service & - ** php-fpm7.0 :: systemctl restart php7.0-fpm.service & - -** processname :: some command +print_sleep_periods = False diff --git a/nohang.logrotate b/nohang.logrotate deleted file mode 100644 index a44beea..0000000 --- a/nohang.logrotate +++ /dev/null @@ -1,9 +0,0 @@ -/var/log/nohang/*.log { - create 640 root adm - missingok - notifempty - weekly - rotate 5 - compress - delaycompress -} diff --git a/nohang.service b/nohang.service index 438b5c2..9520164 100644 --- a/nohang.service +++ b/nohang.service @@ -7,7 +7,7 @@ Documentation=man:nohang(1) https://github.com/hakavlad/nohang [Service] Type=simple Restart=always -StandardOutput=null +StandardOutput=syslog StandardError=syslog ExecStart=/usr/local/bin/nohang diff --git a/purge.sh b/purge.sh index 33bac29..a758270 100755 --- a/purge.sh +++ b/purge.sh @@ -4,6 +4,4 @@ systemctl disable nohang rm /usr/local/bin/nohang rm /usr/local/share/man/man1/nohang.1.gz rm /etc/systemd/system/nohang.service -rm /etc/logrotate.d/nohang rm -r /etc/nohang -rm -r /var/log/nohang