udev実行スクリプトが機能しないのはなぜですか?

udev実行スクリプトが機能しないのはなぜですか?

USBドライブをドキュメントフォルダと同期させるudevルールを作成しましたが、うまくいかないようです。

95-USB-自動同期ルール:

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", RUN+="/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh"

/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh:

#!/bin/bash

rsync -a --delete '/home/riccardo/Documents/Development/' '/run/media/riccardo/Riccardo/Documents/Development' --exclude='*/node_modules' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/KiCAD/' '/run/media/riccardo/Riccardo/Documents/KiCAD' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/Personal Files/' '/run/media/riccardo/Riccardo/Documents/Personal Files' >> /home/riccardo/Documents/Scripts/log.txt
rsync -a --delete '/home/riccardo/Documents/Scripts/' '/run/media/riccardo/Riccardo/Documents/Scripts' >> /home/riccardo/Documents/Scripts/log.txt

スクリプトが実際に実行されていることを確認するために、">> /home/riccardo/Documents/Scripts/log.txt"セクションを追加しました。ただし、log.txtファイルはまだ空です。

東芝USBドライブUdevについて:

  looking at device '/devices/pci0000:00/0000:00:14.0/usb4/4-2':
    KERNEL=="4-2"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{authorized}=="1"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bConfigurationValue}=="1"
    ATTR{bDeviceClass}=="00"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPacketSize0}=="9"
    ATTR{bMaxPower}=="296mA"
    ATTR{bNumConfigurations}=="1"
    ATTR{bNumInterfaces}==" 1"
    ATTR{bcdDevice}=="0001"
    ATTR{bmAttributes}=="80"
    ATTR{busnum}=="4"
    ATTR{configuration}==""
    ATTR{devnum}=="2"
    ATTR{devpath}=="2"
    ATTR{idProduct}=="1408"
    ATTR{idVendor}=="0930"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="TOSHIBA"
    ATTR{maxchild}=="0"
    ATTR{product}=="USB FLASH DRIVE"
    ATTR{quirks}=="0x0"
    ATTR{removable}=="removable"
    ATTR{serial}=="C03FD5FBA9CDC1401D7FB227"
    ATTR{speed}=="5000"
    ATTR{urbnum}=="11182"
    ATTR{version}==" 3.00"

ありがとう、

リカルド

答え1

man udevRUN+=長期実行ジョブではこのキーを使用しないでください。

これは、非常に短期的に実行されるフォアグラウンドジョブでのみ使用できます。長期実行イベントプロセスは、そのデバイスまたはスレーブデバイスに対するすべての追加イベントをブロックできます。

デーモンや他の長期実行プロセスを開始することはudevには適していません。切り離されたかどうかにかかわらず、分岐されたプロセスはイベント処理が完了した後に無条件に終了します。

systemdを使用する最新のシステムでは、正しいアプローチはSYSTEMD_WANTS次のとおりですman systemd.device

UDEVデータベース

デバイスデバイス設定は、デバイスファイルを介して構成することも、udevデータベースから直接構成することもできます(推奨)。 systemd は、次の udev デバイス属性を理解します。


SYSTEMD_WANTS=, SYSTEMD_USER_WANTS= リストされているすべてのデバイスに、デバイスデバイスの希望するタイプの依存関係を追加します。最初の形式はシステムシステムインスタンスで使用され、2 番目の形式はユーザーシステムインスタンスで使用されます。これらの設定は、特定のデバイスが利用可能なときにすべてのデバイスを有効にするために使用できます。

udevデータベースでデバイスに "systemd"文字列がタグ付けされていない場合、このタグとは異なるタグは考慮されません。そうしないと、デバイスがsystemdデバイスに公開されないためです(上記を参照)。

したがって、udevルールは次のようになります。

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", SYSTEMD_WANTS="rsync_backup.service"

次に、デバイスがマウントされたときにバックアップスクリプトを呼び出すサービスファイルを作成します。

[Unit]
Description=Backup riccardo's stuff
Requires=media-Riccardo.mount
After=media-Riccardo.mount

[Service]
ExecStart=/usr/local/bin/rsync_backup_thing

[Install]
WantedBy=media-Riccardo.mount

/media/Riccardoインストールすると、bashスクリプトが実行されます。

答え2

@jasonwryanが提案したように、udevルールを次のように変更しました。

ACTION=="add", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1408", ENV{SYSTEMD_WANTS}="usb-auto-sync.service"

usb-auto-sync.serviceを使用してください。

[Unit]
Description=Auto Sync USB

[Service]
ExecStart=/home/riccardo/Documents/Scripts/sync-riccardo-usb.sh
StandardOutput=null

[Install]
WantedBy=multi-user.target
Alias=usbauto-sync.service

サービスを有効にし、スクリプトが実行中です。

関連情報