Существует определенная ошибка, которая всегда одна и та же, и я попадаю в системный журнал, однако я не совсем уверен, чем вызвана ошибка, поэтому я хотел бы получать оповещения сразу же, когда она возникает. Предпочтительно, я хотел бы, чтобы что-то вроде скрипта отслеживало системный журнал для любых строк, содержащих это определенное сообщение, и, если оно было обнаружено, немедленно предупреждает меня через notify-send
и затем регистрирует его в файле. Я использую Ubuntu GNOME 16.04 с GNOME 3.20. Как я могу добиться этого с помощью сценария? Или есть какое-то программное обеспечение, которое позволило бы мне сделать это?
Здесь, сценарий, в Python:
Файл проверок для изменений каждые 5 секунд, если изменено, это проверяет на строку. Если строка найдена:
notify-send
Использование:
python3 LogMonitor.py [log file] [string to watch]
Дополнительные аргументы, чтобы быть помещенным после вышеупомянутого
beep
и/или notify
- это заставит сценарий подавать звуковой сигнал и/или уведомлять (использование notify-send
) в дополнение к печати сообщенияТак, если я хочу смотреть /var/log/auth.log
для SSH и заставляют звуковой сигнал звучать и уведомить меня, я буду:
python3 LogMonitor.py /var/log/auth.log SSH beep notify
Необработанная загрузка (Щелкают правой кнопкой по →, Сохраняет ссылку как): Суть GitHub
#!/usr/bin/env python
import os
import sys
import subprocess
import collections
import time
import mmap
try:
LOG_FILE = os.path.abspath(sys.argv[1])
WATCH_FOR = sys.argv[2]
except:
sys.stderr.write(
'Usage: %s [log file] [string to watch for]' % sys.argv[0])
sys.exit(1)
def action():
if 'beep' in sys.argv:
subprocess.Popen(['paplay', '/usr/share/sounds/ubuntu/notifications/Mallet.ogg'])
if 'notify' in sys.argv:
subprocess.Popen(['notify-send', 'LogMonitor', 'Found!'])
print(time.strftime('%Y-%m-%d %I:%M:%S %p'), 'Found! \n', i)
# basic Python implementation of Unix tail
def tail(file, n):
with open(file, "r") as f:
f.seek (0, 2) # Seek @ EOF
fsize = f.tell() # Get Size
f.seek (max (fsize-1024, 0), 0) # Set pos @ last n chars
lines = f.readlines() # Read to end
lines = lines[-n:] # Get last 10 lines
return lines
print(
'Watching of ' + LOG_FILE + ' for ' + WATCH_FOR +
' started at ' + time.strftime('%Y-%m-%d %I:%M:%S %p'))
mtime_last = 0
while True:
mtime_cur = os.path.getmtime(LOG_FILE)
if mtime_cur != mtime_last:
for i in tail(LOG_FILE, 5):
if WATCH_FOR.lower() in i.lower():
action()
mtime_last = mtime_cur
time.sleep(5)