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 파일은 여전히 비어 있습니다.
Toshiba 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= 나열된 모든 장치에 장비 장치의 원하는 유형 종속성을 추가합니다. 첫 번째 형식은 시스템 시스템 인스턴스에서 사용되고 두 번째 형식은 사용자 시스템 인스턴스에서 사용됩니다. 이러한 설정은 특정 장치를 사용할 수 있을 때 모든 장치를 활성화하는 데 사용할 수 있습니다.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
서비스를 활성화했고 이제 스크립트가 실행 중입니다.