내 디렉토리를 보관하는 스크립트를 시작하기 위해 몇 가지 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