web-dev-qa-db-ja.com

Ubuntuでbtrfsチェックサムエラーが発生したときに通知を表示する方法

Aa-notifyのように、AppArmorが何かを拒否したときにデスクトップに通知を表示します。

1
Artyom

以下のスクリプトをバックグラウンドで実行すると、どちらも通知が表示されます。

enter image description here

...次のように、タイムスタンプ付きのエラーメッセージをログファイル(~/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権限が必要です。
    ただし、ifdmesgの出力が他の目的でも必要な場合は、回避する必要があります。もしそうなら言及してください。
  3. 次のコマンドでテスト実行します。

    Sudo check_btrfs
    

    $PATHのディレクトリにコピーした場合。そうでない場合は、スクリプトへのパスを含めます。

  4. すべて正常に動作する場合は、[スタートアップアプリケーション]に追加します。次のコマンドを追加します。

    Sudo check_btrfs
    

「実際の」btrfsエラーではテストできないため、他のイベントをチェックして実行しました(USBスティックを差し込む)。最後のスクリプトでは、リンクにメッセージ形式を使用しました。スクリプトは、文字列btrfserrorの両方を含む行をチェックします。

WHat it does

スクリプト:

  • 4秒に1回、dmesgの出力を読み取ります
  • エラーが発生した場合は、通知が表示され、エラーがファイルに追加されます:~/btrfs_errors.txt
  • dmesgの履歴をクリアして、スクリプトを「ジュース不足」に保ちます。
1
Jacob Vlijm