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


41

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

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

回答:


27

次のようなファイルに/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句を、異なるスタンザにリストされている他のタイプの句と混在させることができます。


1
この回答はまだ有効ですか?いじくり回すことなく、スクリプトを実行(およびファイルに触れる)することはできません。何かがプラグインされたときにスクリプトを実行する最も基本的な例を提供できれば、それは素晴らしいことであり、そこから作業を進めることができます。
レッドサンドロ

@Redsandro私のudev設定にはこのルールのバリエーションがあり、機能しています。デバイスのプラグを抜き差ししましたudevadm triggerか、それとも実行しましたか?システムはudevを使用していますか?プラグインされたときにスクリプトを実行する場合は、すべての条件(を持つ句==)を削除します(構文には1つの条件が必要かもしれませんが、そうでない場合はを使用してくださいKERNEL=="*")。
ジル 'SO-悪であるのをやめる'

私もそれを試してみましたが、それはあなたのために働くので、私は一歩を逃したに違いありません。私がいるここにこの質問を移動するので、私は例のコードを書くことができます。
レッドサンドロ

おそらく関連しているので、スクリプトを実行できる時間には時間制限があると思います。私はそれが非常に短いと信じています(1秒か何かのように)。それよりも時間がかかる場合、udevはそれを殺します。このような問題を回避するには、スクリプトの背景をのようなものにしatます。「外部プログラムを実行する」を参照してください。reactivated.net/writing_udev_rules.html
cheshirekow

ただ、完全性のために、これに追加し、ファイルのニーズは接尾持っている.rules(規則は順番それらに数値接頭辞を使用しています)と、ディレクトリ内のファイルは、字句順に読み込まれ、そして、彼らは下にすることができ/etc//usr/libまたは/run。詳細については、RTFM
スターフライ

14

/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

1
udevadm control --reload-rulesディストリビューションによっては、を使用してudevルールをリロードする必要がある場合があります。
-user44038

1
at now私が提案する代わりにbatch
モニカの復職-M.シュレーダー

あなたも持っていatないときはどうしますbatchか?busyboxが組み込まれた環境にいます
ナテンホ

@natenho、などを使用できます~/path/mountcopystuff.sh &- at何かがうまくいかない場合に電子メール通知を受け取るという利点があります-しかし、組み込みシステムではおそらくこれはあまり興味がありません。
maxschlepzig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.