USBデバイスを接続するたびに実行するスクリプトを設定しようとしています。ファイル/ etc/udev/rules.d/90-local.rulesを作成し、次のルールを追加しました:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
問題は、ドライブが接続されているときに何も起こらないことです。スクリプトは、デバッグの目的で、端末からインストールして正常に機能するnotify-sendを使用して通知を送信するようになっています。
正確なコマンドをターミナルで問題なく実行したので、スクリプトへのパスは正しいです。
同じ問題がありました。これは私のために働きました:
スクリプトを/usr/local/bin
にコピーして、.rules
ファイルのディレクトリを変更してみてください。
また、SYSFSが何かはわかりませんが、ATTRプロパティを使用したいと思います。
次の行は、私の.rules
ファイルの内容です。
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
notify-send
には、DBusセッションバスへのアクセスが必要です。これには、次の2つの理由でこれを行うことはできません。
セッションに関する情報はありません。 udevによって開始されたとき、スクリプトはnothingがどこにログインしているか、またはまったくログインしているかどうかを認識しています。 X11でのマルチシートはまだ扱いにくいですが、ユーザー切り替えはX11とコンソールセッションの両方で機能します。また、多くの人がネットワーク経由でSSH、VNC、NXを使用しています。
(DISPLAY=:0
は半分の時間で動作しますが、それでも推測でも十分です。)
DBusポリシーによって拒否されました。スクリプトが何らかの方法でX11セッションを検出した場合でも、スクリプトがユーザーアカウントではなくroot
として実行されているため、通知を送信できません。
代わりに、ベンダーIDと製品IDでデバイスを一致させることができます。次のカスタムルールが機能します。
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"
デバイスを接続した後、lsusb出力またはdmesgでidVendorおよびidProductを確認できます。
Alehの回答のフォローアップ:remove
イベントも監視する場合は、ID_SERIAL
という名前の環境変数を探す必要があります。アンダースコアで区切られたベンダーIDと製品IDが含まれています。
ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"
ルールも短くなりました。
SUBSYSTEM = "usb"をSUBSYSTEMS = "usb"に置き換えてみてください
おそらく、USBデバイスに「落ち着く」機会を与えるために、スクリプト内にsleep
を追加する必要があるかもしれません。たとえば、USB 3Gモデム、/ dev/ttyUSBを取得するためのモード切り替え、カーネルによる起動および実行。