Debian / CentOS / Fedoraのような現在のLinuxディストリビューションでUSBデバイスプラグインでカスタムスクリプトを自動的に実行するための最新の方法は何ですか?
たとえば、UUID(またはデバイスIDなど)に基づいてUSB大容量ストレージデバイスを自動的にマウント/コピー/アンマウントする場合。
Debian / CentOS / Fedoraのような現在のLinuxディストリビューションでUSBデバイスプラグインでカスタムスクリプトを自動的に実行するための最新の方法は何ですか?
たとえば、UUID(またはデバイスIDなど)に基づいてUSB大容量ストレージデバイスを自動的にマウント/コピー/アンマウントする場合。
回答:
次のようなファイルに/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
た新しいエントリに対応する、ディスクに自動的に割り当てられたデバイス名に置き換えます)。ATTRS
任意の1つのスタンザから句を使用できることに注意してください。任意のスタンザを選択できますが、ATTRS
すべての句は同じスタンザからのものである必要があり、組み合わせて使用することはできません。ATTRS
句を、異なるスタンザにリストされている他のタイプの句と混在させることができます。
udevadm trigger
か、それとも実行しましたか?システムはudevを使用していますか?プラグインされたときにスクリプトを実行する場合は、すべての条件(を持つ句==
)を削除します(構文には1つの条件が必要かもしれませんが、そうでない場合はを使用してくださいKERNEL=="*"
)。
at
ます。「外部プログラムを実行する」を参照してください。reactivated.net/writing_udev_rules.html
/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
udevadm control --reload-rules
ディストリビューションによっては、を使用してudevルールをリロードする必要がある場合があります。
at now
私が提案する代わりにbatch
。
~/path/mountcopystuff.sh &
- at
何かがうまくいかない場合に電子メール通知を受け取るという利点があります-しかし、組み込みシステムではおそらくこれはあまり興味がありません。