내 udev 규칙이 3번 실행되는 이유는 무엇입니까?

내 udev 규칙이 3번 실행되는 이유는 무엇입니까?

내 디렉토리를 보관하는 스크립트를 시작하기 위해 몇 가지 udev 규칙을 만들었습니다 ~/Documents. 이렇게 하면 작업이 완료되지만 로그 파일을 읽을 때 키를 삽입하면 아카이브 스크립트가 3번 실행되는 것 같습니다.

내 규칙은 다음과 같습니다.

ACTION=="add", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1642", RUN+="/bin/sh /root/auto-archive" 

이것은 내 스크립트입니다.

#! /bin/sh

sleep 5

# test if awesome is running
if ps aux | grep -v launch | grep -v grep | grep awesome
then
    echo awesome is running >> /home/purplepsycho/log
else
    # echo awesome not running another guy must be logged
    exit
fi

if mount | grep /media/usb
then
    echo /media/usb already mounted >> /home/purplepsycho/log
    exit
fi

# mount key
echo mounting... >> /home/purplepsycho/log
/usr/bin/sudo -u purplepsycho mount /media/usb

# test if mount have been succesful
if [ $? -ne 0 ]
then
    echo mount failed >> /home/purplepsycho/log
    exit
fi
# archive dir
ARC_DIR="/media/usb/archive"

# make directory
mkdir -p $ARC_DIR

# archive name
NAME=$(date +"archive-%Y-%m-%d.tgz")

# test if an archive already exists for today
if [ -f $ARC_DIR/$NAME ] 
then
    echo archive file already exists for today >> /home/purplepsycho/log
    exit
fi

# initialize log file
echo $NAME > $ARC_DIR/files.txt

# make the archive
tar -zcvf $ARC_DIR/$NAME /home/purplepsycho/Documents/* >> $ARC_DIR/files.txt

어떤 아이디어가 있나요? 감사해요.

---Sparhawk의 의견 이후 편집됨---

나는 udevadm열쇠를 가지고 달린다:

udevadm info -a -p $(udevadm info -q path -n /dev/sbd)

이는 다음을 제공합니다:

looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0/block/sdb':
  KERNEL=="sdb"
  SUBSYSTEM=="block"
  DRIVER==""

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host4/target4:0:0/4:0:0:0':
  KERNELS=="4:0:0:0"
  SUBSYSTEMS=="scsi"
  DRIVERS=="sd"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host4/target4:0:0':
  KERNELS=="target4:0:0"
  SUBSYSTEMS=="scsi"
  DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0/host4':
  KERNELS=="host4"
  SUBSYSTEMS=="scsi"
  DRIVERS==""

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0':
  KERNELS=="1-1:1.0"
  SUBSYSTEMS=="usb"
  DRIVERS=="usb-storage"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-1':
  KERNELS=="1-1"
  SUBSYSTEMS=="usb"
  DRIVERS=="usb"
  ATTRS{idVendor}=="0951"
  ATTRS{idProduct}=="1642"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
  KERNELS=="usb1"
  SUBSYSTEMS=="usb"
  DRIVERS=="usb"
  ATTRS{idVendor}=="1d6b"
  ATTRS{idProduct}=="0002"

looking at parent device '/devices/pci0000:00/0000:00:1d.7':
  KERNELS=="0000:00:1d.7"
  SUBSYSTEMS=="pci"
  DRIVERS=="ehci-pci"
  ATTRS{irq}=="23"

looking at parent device '/devices/pci0000:00':
  KERNELS=="pci0000:00"
  SUBSYSTEMS==""
  DRIVERS==""

나는 다음 사항만을 토대로 규칙을 작성하려고 합니다.

  KERNELS=="1-1"
  SUBSYSTEMS=="usb"
  DRIVERS=="usb"
  ATTRS{idVendor}=="0951"
  ATTRS{idProduct}=="1642"

그리고

  KERNELS=="usb1"
  SUBSYSTEMS=="usb"
  DRIVERS=="usb"
  ATTRS{idVendor}=="1d6b"
  ATTRS{idProduct}=="0002"

결과는 동일합니다. 스크립트가 여러 번 호출됩니다.

답변1

문제는 규칙에서 비롯됩니다. 장치 자체가 아닌 장치의 상위 항목만 일치시키려고 합니다. 참조http://reactivated.net/writing_udev_rules.html#sysfstree세부:

  • KERNEL=장치( , SUBSYSTEM=, ATTR=...) 와 일치해야 합니다 .
  • KERNELS=그리고 그 부모( , SUBSYSTEMS=, ...) 중 하나 ATTRS=(참고'에스'필드 끝에서).

수정된 규칙은 다음과 같습니다.

ACTION=="add", KERNEL=="sdb1", SUBSYSTEM=="block", ATTRS{vendor}=="Kingston", ATTRS{model}=="DT 101 G2", RUN+="/bin/sh /root/auto-archive"

답변2

나는 단지 내 (경험적) 발견을 여기에 추가할 뿐입니다. 다른 사람에게 도움이 될 경우를 대비해서입니다.

나는 대본을 쓰고 있는데 언제클립 걸림Raspberry Pi 4의 USB 포트에 연결하세요. (Rasbian Buster 실행, 2021년 후반 릴리스): 이는 본질적으로 USB 저장 장치이며 파일 시스템으로 마운트됩니다.

/dev/sda1       7.8G  7.6G  206M  98% /media/pi/Clip Jam

또한 장치를 연결하면 스크립트가 여러 번(예: 25번!) 실행되는 것을 볼 수 있습니다.

위 게시물은 명령 출력에서 ​​단수 항목("커널")과 복수 항목("커널") 간의 차이점을 확인하는 데 도움이 됩니다.

udevadm info -a /dev/sda1

하지만 내가 감사하지 않는 점은 규칙이 일치하는 것 같다는 것입니다. 표시된 정보를 정확하게 일치시켜야 할 것 같습니다.한 번상위 목록에 있습니다.

내 경우에는 이 항목이 있는 유일한 부모를 식별할 수 있었습니다.

ATTRS{product}=="Clip Jam"

그래서 제가 작성한 규칙(/etc/udev/rules.d/999-tester.rules)은 다음과 같았습니다.

ACTION=="add" \
, KERNEL=="sda1" \
, SUBSYSTEM=="block" \
, ATTRS{product}=="Clip Jam" \
, ENV{DISPLAY}=":0" \
, ENV{XAUTHORITY}="/home/pi/.Xauthority" \
, RUN+="/home/pi/Desktop/tester.sh"

여기에 참고 사항이 있습니다.

ACTION=="add" \ <-- The action we are interested in.
, KERNEL=="sda1" \ <---- Top of the output of the 'udevadm' command.
, SUBSYSTEM=="block" \ <---- Top of the output of the 'udevadm' command.
, ATTRS{product}=="Clip Jam" \ <--- Found (trial and error) in list of parents; unique entry throughout 'udevadm' output.
, ENV{DISPLAY}=":0" \ <-- Taken from 'env' output
, ENV{XAUTHORITY}="/home/pi/.Xauthority" \ <-- Taken from 'env' output
, RUN+="/home/pi/Desktop/tester.sh" <-- Testing script only.

기억해야 할 또 다른 사항: 규칙 명령을 편집한 후 새로 고침 명령을 다시 실행하십시오! (잊기 쉬움!)

sudo udevadm control --reload

관련 정보