Как заставить Ubuntu показывать уведомление при сбое контрольной суммы btrfs?

Как aa-notify, который показывает уведомление на моем рабочем столе, когда AppArmor что-то отрицает.

1 ответ

Решение

Запуск сценария ниже в фоновом режиме покажет уведомление:

... и добавить сообщение об ошибке с отметкой времени в файл журнала (~/btrfs_errors.txt), выглядит как:

Mon Oct 10 08:25:12 2016
BTRFS error (device md2): csum failed ino 7551 off 2310144 csum 623932426 expected csum 3810482428

Сценарий

#!/usr/bin/env python3
import subprocess
import time
import os

log = os.path.join(os.environ["HOME"], "btrfs_errors.txt")                                     

while True:
    msginfo = subprocess.check_output(["dmesg", "--read-clear"]).decode("utf-8")
    match = [l for l in msginfo.splitlines() if all(["btrfs" in l, "error" in l])]
    if match:
        with open(log, "a+") as out:
            out.write(time.ctime()+"\n")
            for l in match:
                out.write(l)
            out.write("\n\n")
        subprocess.Popen(["notify-send", "-i", "gnome-disks",
                 "BTRFS error","Please see ~/btrfs_errors.txt for details"])

    time.sleep(4)

Как пользоваться

  1. Скопируйте приведенный выше скрипт в пустой файл, сохраните его как check_btrfs, Скопируйте сценарий в место, где его нельзя редактировать без прав администратора, например /usr/local/bin, Сделайте скрипт исполняемым (!).
  2. Добавьте скрипт в sudoers файл, как описано, например, здесь. Это необходимо, потому что скрипт запускается с помощью sudo, Сценарий читает из dmesg и очищает dmesg 'история после чтения, чтобы предотвратить накопление объема вывода для чтения. клиринг dmesg нужны привилегии sudo.
    Это означает, однако, что если вам нужен вывод dmesg для других целей также нам нужно обойти. Если это так, пожалуйста, укажите.
  3. Протестируйте его с помощью команды:

    sudo check_btrfs
    

    если вы скопировали его в каталог в $PATH, Если нет, укажите путь к сценарию.

  4. Если все работает нормально, добавьте его в Startup Applications: Dash > Startup Applications > Add. Добавьте команду:

    sudo check_btrfs
    

Поскольку я не могу проверить это с "реальным" btrfs ошибки, я запустил его с проверкой других событий (подключив флешку). В финальном сценарии я использовал формат сообщения в вашей ссылке. Скрипт проверяет строки, содержащие обе строки btrfs а также error,

Что оно делает

Сценарий:

  • один раз в четыре секунды читает вывод dmesg
  • в случае ошибки, он показывает уведомление и добавляет ошибку в файл: ~/btrfs_errors.txt
  • очищает историю dmesg держать сценарий "мало на сок".
Другие вопросы по тегам