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 파일은 여전히 ​​비어 있습니다.

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 udevRUN+=장기 실행 작업에는 이 키를 사용하면 안 된다는 점을 설명합니다 .

이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.

데몬이나 기타 장기 실행 프로세스를 시작하는 것은 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

서비스를 활성화했고 이제 스크립트가 실행 중입니다.

관련 정보