web-dev-qa-db-ja.com

デバイスがUSB経由で接続されているときにコマンドを実行する

現在、Linuxサーバーを/media/usbのUSBストレージデバイスにバックアップするシステムがあります。これはすべて正しく機能します。ただし、実際には2つのドライブがあり、毎日交換しようとしています。

USBデバイスが接続されたときにログを記録する方法や、たとえばドライブが3日以上交換されていない場合に、sendmailなどを使用して管理者に電子メールを送信する方法はありますか?

3
Schodemeiss

/ var/log/messagesを解析することはできますが、私は解析しません。

デバイスを接続/切断するときにスクリプトを実行するudevルールを作成します。それについてもっと情報があります ここ

そのサイトがダウンした場合に備えて、重要なポイントをコピーしました。

ルールファイルは/etc/udev/rules.d/ディレクトリに保存されます。

ルールファイルに名前を付ける方法について、そのディレクトリのREADME)からいくつかのアドバイスがあります。

ファイルにはxx-descriptive-name.rulesという名前を付ける必要があります。最初に、次のシーケンスポイントに従ってxxを選択する必要があります。

<60のほとんどのユーザールール。デフォルトのルールで割り当てが上書きされないようにする場合は、:=演算子を使用します。

これらは、vol_idからのような永続的な情報にアクセスできません

vol_idなどのヘルパーを実行してudevデータベースにデータを入力する70未満のルール

他のプログラムを実行する90未満のルール(多くの場合、udevデータベースの情報を使用)

=最後に実行する必要がある90のルール

Udevルールの最初の部分は、一致するキーです。チェーンの最上部からのKERNELエントリと、デバイス固有の情報からのidVendor、idProduct、およびシリアル属性を使用します。これにより、この特定のサムドライブが明確に識別され、他のすべてが無視されます。カーネル引数は疑問符をワイルドカードとして使用するため、ドライブが別のノード(つまり、sda1、sdb1、sdc1など)にマウントされている場合でも識別できます。

KERNEL=="sd?1", ATTRS{idVendor}=="13fe", ATTRS{idProduct}=="1f00",
ATTRS{serial}=="50E6920B000AE8" 

探している特定のハードウェアを識別するために必要なキーが揃ったので、割り当て引数を追加できます。この場合、2つ追加しました。 1つ目は、/ dev /ディレクトリ内にこのデバイスへのシンボリックリンクを作成します。 2つ目は、ホームディレクトリでスクリプトを実行します。

SYMLINK+="hackaday", RUN+="/home/mike/notify-plugin.sh 'HackaDay Thumbdrive:' 'Connected as: $KERNEL'" 

これが1行にまとめられた最終ルールです。

KERNEL=="sd?1", ATTRS{idVendor}=="13fe", ATTRS{idProduct}=="1f00", ATTRS{serial}=="50E6920B000AE8", SYMLINK+="hackaday", RUN+="/home/mike/notify-plugin.sh 'HackaDay Thumbdrive:' 'Connected as: $KERNEL'" 

これをルールファイルの唯一の行として追加し、次のコマンドを使用してudevを再起動しました。

Sudo nano /etc/udev/rules.d/81-thumbdrive.rules 
Sudo /etc/init.d/udev restart
7
Tom O'Connor

はい、USBデバイスを接続または切断するたびに、1つまたは複数のメッセージが/ var/log/messagesに書き込まれます。コマンドdmesgを使用して、それらを簡単にチェックアウトできます。接続/切断メッセージをチェックし、それに応じて行動するために、(x)単位時間ごとにそのファイルをポーリングすることは、まったく不合理ではありません。

1
user1463169