web-dev-qa-db-ja.com

USBデバイスプラグインでカスタムスクリプトを実行する方法

Debian/CentOS/Fedoraのような現在のLinuxディストリビューションのUSBデバイスプラグインでカスタムスクリプトを自動的に実行する最先端の方法は何ですか?

たとえば、UUID(またはデバイスIDなど)に基づいて一部のファイルを自動的にマウント/コピー/ USB大容量ストレージデバイスをアンマウントする場合などです。

42
maxschlepzig

このような行を/etc/udev/rules.dのファイルに入れます。

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

NAME="subdir/mydisk%n"の下にカスタムエントリパスを使用する場合は、/devのような句を追加します。

udevadm info -a -n sdbを実行して、照合できる属性を確認します(attribute=="value"; sdbを、/devで作成された新しいエントリに対応する、ディスクに自動的に割り当てられたデバイス名に置き換えます差し込んだとき)。 oneスタンザからATTRS句を使用できることに注意してください。任意のスタンザを選択できますが、ATTRS句はすべて同じスタンザから取得する必要があります。 tミックスアンドマッチ。 ATTRS句を、別のスタンザにリストされている他のタイプの句と混在させることができます。

ディスク関連のルールの例については、/lib/udev/rules.dを調べました。 Ubuntuシステムでは、1つのルールファイルが環境変数ID_FS_UUID_ENCを提供し、これを独自のルールファイルで使用できます。

したがって、カスタムルールファイルを/etc/udev/rules.d/foodevice.rulesの下に置きます。番号が前に付いていないので、ついにudevによって実行されます。ところで、udevデーモンは、ファイルの変更時に再起動する必要がないように、/etc/udev/rules.dの変更を監視しました。

/etc/udev/rules.d/foodevice.rulesの内容は次のとおりです。

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/Sudo -u juser /home/juser/path/script.sh"

(これは1つのルールです-udevには行継続メカニズムがないため、ENV句の後の改行を削除する必要があります)

Udevによって起動されたプログラムはデーモンをブロックします-したがって、それは長時間実行されるべきではありません。私はatを介してそれを解決しました-つまり、実際の仕事をしているプロセスから切り離すことによって:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
14
maxschlepzig