web-dev-qa-db-ja.com

udevルールが機能しないのはなぜですか?

スクリプトを自動的に実行する必要があります/var/www/html/configWWW USBが私のRasperryに接続されているとき。

UDEVルール-/etc/udev/rules.d/myRule.rules

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="****",
ATTR{idProduct}=="****", RUN+="/var/www/html/configWWW"

私のスクリプト/var/www/html/configWWW

#!/bin/bash
file="/media/pi/`ls /media/pi`/SymSif.xml"
if [ -f "$file" ]
then
        (
        echo "it works: $(date)" >> /home/pi/Desktop/test.txt
        )
else
        (
        echo "it does not works: $(date)" >> /home/pi/Desktop/test.txt
        )
fi

一方、bashからスクリプトを実行すると、bash /var/www/html/configWWW、 できます!

Udevルールがbashコマンドのように機能しないのはなぜですか?

1
Daniel

udevadm info -a ...を投稿します。とにかく、ここで私が期待するいくつかのこと:

  • スクリプトの実行許可ビットを設定します。
  • ルールファイル名を標準形式に変更します。例:99-alpha.rules
  • SUBSYSTEMSUBSYSTEMSの違い、およびATTRATTRSの違いを確認してください。

見る man udev

1
user.dz

Udevからスクリプトを実行すると問題が発生します。サンドボックスが破棄されても、ほとんど残りません(マウント、ネットワーク接続など)。 2番目の理由は、udevから実行されるスクリプトがこのデバイスまたは依存デバイスの以降のすべてのイベントをブロックし、最終的にタイムアウトし、スクリプトによって開始された実行中のすべてのプロセスが無条件に終了することです。

Systemdを使用しても同じ結果が得られます。

$ cat /etc/systemd/system/garmin.service
[Unit]
Description=Autorun actions for Garmin FR620
Requires=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device
After=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device

[Service]
ExecStart=/opt/bin/autorun_garmin_fr620.sh

[Install]
WantedBy=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device

デバイスを接続してsystemctl --all list-unitsを実行すると、.deviceユニットを見つけることができます

.serviceを有効にすることを忘れないでください:

$ systemctl enable garmin.service


または、udevルールからsystemd .serviceを開始できます:

$ cat /etc/udev/rules.d/99-garmin-autorun.rules
# Start garmin FR620 systemd .service
ACTION=="add", \
KERNELS=="3-3", \
SUBSYSTEMS=="usb", \
ATTRS{idProduct}=="2657", \
ATTRS{idVendor}=="091e", \
TAG+="systemd", ENV{SYSTEMD_WANTS}="garmin.service"

...そしてsystemd .serviceは次のようになります:

[Unit]
Description=Autorun actions for Garmin FR620

[Service]
Type=oneshot
ExecStart=/opt/bin/autorun_garmin_fr620.sh
0
bac0n