udevを使用してUSB接続イベントを検出し、スクリプトを実行しようとしています。これには多くの例がありますが、うまく動作しないようです。
私のスクリプトは/usr/bin/
とても簡単ですusbattached.sh
!/bin/bash
echo !Hello World!
mkdir /media/usb_device
mount /dev/sda1 /media/usb_device
/etc/udev/rules.dのルールも非常に簡単です。usbconnected.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0243", RUN+="/bin/usbattached.sh"
デバイスを何度もリセットし、udevが更新されることを願っています。これまではそうではありません。また、成功せずにルールを更新するコマンドを実行してみました。
udevadm control --reload-rules && udevadm trigger
私のルール/スクリプトに問題がありますか?
USBをデバイスに接続すると出力が出ます。
root@imx6ull14x14evk:/usr/bin# [ 344.348033] usb 1-1: USB disconnect, device number 2
[ 347.572148] usb 1-1: new high-speed USB device number 3 using ci_hdrc
[ 347.796563] usb 1-1: New USB device found, idVendor=18a5, idProduct=0243, bcdDevice= 0.02
[ 347.805120] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 347.820492] usb 1-1: Product: STORE N GO
[ 347.829885] usb 1-1: Manufacturer: Verbatim
[ 347.839204] usb 1-1: SerialNumber: 12050602000042
[ 347.864925] usb-storage 1-1:1.0: USB Mass Storage device detected
編集:スクリプトの実行権限を付与しました。chmod +x usbattached.sh
編集2:udevデバッグをオンにしてjournctlを見るUSBデバイスを削除して追加しました。ログに見る
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: /etc/udev/rules.d/usbconnected.rules:1 RUN '/bin/usbattached.sh
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Running command "/bin/usbattached.sh"
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Starting '/bin/usbattached.sh'
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: Successfully forked off '(spawn)' as PID 275.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Process '/bin/usbattached.sh' failed with exit code 1.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Command "/bin/usbattached.sh" returned 1 (error), ignoring.
これは私のスクリプトが実行中ですが、問題が発生したことを意味します。
答え1
!/bin/bash
bash shebangの形式が正しくありません(最初の文字はでなければなりません#
)。また、およびなしのudev
スクリプトのみが実行されます。最初にすべきことはshebangを 。sh
bash
#!/bin/sh
echo !Hello World!
!
は特殊文字なので、その文字を含む文字列を引用する必要があります。それ以外の場合はシェルで解釈されます。 (前任者:echo '!Hello World!'
スクリプトは対話型シェルでは実行されないため、
udev
テキストecho
はどこにも表示されません。スクリプトが実行されていることを確認するには、スクリプトをファイルにリダイレクトします。 (echo '!Hello World!' > /tmp/output_$(date +%s).txt
この$(date +%s)
セクションでは、スクリプトが実行されるたびにファイルに一意の名前を付けます。)
答え2
/home/michael
問題を解決するには、スクリプトを移動してください。私はこれがユーザー権限に関連していると思います。
開発中に端末をrootユーザーとして使用します。私がやったようにコマンドを実行すると、期待/usr/bin
どおりに動作します。 udevがroot権限なしでユーザーとして実行されているとします。