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 udev
RUN+=
長期実行ジョブではこのキーを使用しないでください。
これは、非常に短期的に実行されるフォアグラウンドジョブでのみ使用できます。長期実行イベントプロセスは、そのデバイスまたはスレーブデバイスに対するすべての追加イベントをブロックできます。
デーモンや他の長期実行プロセスを開始することは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
サービスを有効にし、スクリプトが実行中です。