スクリプトを自動的に実行する必要があります/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コマンドのように機能しないのはなぜですか?
udevadm info -a ...
を投稿します。とにかく、ここで私が期待するいくつかのこと:
99-alpha.rules
SUBSYSTEM
とSUBSYSTEMS
の違い、およびATTR
とATTRS
の違いを確認してください。見る man udev
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