Udevルールが実行され、スクリプトが失敗します。

Udevルールが実行され、スクリプトが失敗します。

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を 。shbash#!/bin/sh

echo !Hello World!

  1. !は特殊文字なので、その文字を含む文字列を引用する必要があります。それ以外の場合はシェルで解釈されます。 (前任者:echo '!Hello World!'

  2. スクリプトは対話型シェルでは実行されないため、udevテキストechoはどこにも表示されません。スクリプトが実行されていることを確認するには、スクリプトをファイルにリダイレクトします。 (echo '!Hello World!' > /tmp/output_$(date +%s).txtこの$(date +%s)セクションでは、スクリプトが実行されるたびにファイルに一意の名前を付けます。)

おすすめ記事