如何让 Ubuntu 在 btrfs 校验和失败时显示通知?

如何让 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. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

    sudo check_btrfs
    

由于我无法用“真实”错误来测试它,因此我通过检查其他事件(插入 USB 棒)来运行它。在最终的脚本中,我使用了您链接中的消息格式。该脚本检查包含字符串和的btrfs行。btrfserror

它能做什么

剧本:

  • 每四秒读取一次输出dmesg
  • 如果发生错误,它会显示通知并将错误添加到文件中:~/btrfs_errors.txt
  • 清除历史记录dmesg以保持脚本“电量不足”。

相关内容