就像 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)
如何使用
- 将上面的脚本复制到一个空文件中,保存为
check_btrfs
。将脚本复制到没有管理员权限就无法编辑的位置,例如/usr/local/bin
。使脚本可执行(!)。 - 将脚本添加到
sudoers
文件中,如下所述这里。这是必要的,因为脚本是使用 运行的sudo
。脚本从 读取dmesg
,并dmesg
在读取后清除 ' 历史记录,以防止累积要读取的输出量。清除dmesg
需要 sudo 权限。
然而,这意味着如果如果您还需要输出dmesg
用于其他目的,我们需要另辟蹊径。如果是,请告知。 使用以下命令运行测试:
sudo check_btrfs
如果您将其复制到 目录中
$PATH
。如果不是,请包含脚本的路径。如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
sudo check_btrfs
由于我无法用“真实”错误来测试它,因此我通过检查其他事件(插入 USB 棒)来运行它。在最终的脚本中,我使用了您链接中的消息格式。该脚本检查包含字符串和的btrfs
行。btrfs
error
它能做什么
剧本:
- 每四秒读取一次输出
dmesg
- 如果发生错误,它会显示通知并将错误添加到文件中:
~/btrfs_errors.txt
- 清除历史记录
dmesg
以保持脚本“电量不足”。