udev를 사용하여 USB 연결 이벤트를 감지한 다음 스크립트를 실행하려고 합니다. 이에 대한 많은 예가 있지만 제대로 작동하지 않는 것 같습니다.
내 스크립트는 /usr/bin/
매우 간단합니다usbattached.sh
!/bin/bash
echo !Hello World!
mkdir /media/usb_device
mount /dev/sda1 /media/usb_device
/etc/udev/rules.d의 규칙도 매우 간단합니다.usbconnected.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0243", RUN+="/bin/usbattached.sh"
장치를 여러 번 재설정했으며 udev가 업데이트되기를 바랍니다. 지금까지는 그렇지 않습니다. 또한 성공하지 못한 채 규칙을 새로 고치는 명령을 실행해 보았습니다.
udevadm control --reload-rules && udevadm trigger
내 규칙/스크립트에 문제가 있나요?
USB를 장치에 연결하면 출력이 나옵니다.
root@imx6ull14x14evk:/usr/bin# [ 344.348033] usb 1-1: USB disconnect, device number 2
[ 347.572148] usb 1-1: new high-speed USB device number 3 using ci_hdrc
[ 347.796563] usb 1-1: New USB device found, idVendor=18a5, idProduct=0243, bcdDevice= 0.02
[ 347.805120] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 347.820492] usb 1-1: Product: STORE N GO
[ 347.829885] usb 1-1: Manufacturer: Verbatim
[ 347.839204] usb 1-1: SerialNumber: 12050602000042
[ 347.864925] usb-storage 1-1:1.0: USB Mass Storage device detected
편집: 스크립트 실행 권한을 부여했습니다.chmod +x usbattached.sh
편집 2: udev 디버깅을 켜고 journctl을 시청합니다. USB 장치를 제거하고 추가했습니다. 로그에 보니
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: /etc/udev/rules.d/usbconnected.rules:1 RUN '/bin/usbattached.sh
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Running command "/bin/usbattached.sh"
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Starting '/bin/usbattached.sh'
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: Successfully forked off '(spawn)' as PID 275.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Process '/bin/usbattached.sh' failed with exit code 1.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Command "/bin/usbattached.sh" returned 1 (error), ignoring.
이는 내 스크립트가 실행 중이지만 문제가 발생했음을 의미합니다.
답변1
!/bin/bash
bash shebang의 형식이 잘못되었습니다(첫 번째 문자는 이어야 함 #
). 또한 , 및 없음이 udev
있는 스크립트만 실행됩니다 . 가장 먼저 해야 할 일은 shebang을 .sh
bash
#!/bin/sh
echo !Hello World!
!
은 특수 문자이므로 해당 문자가 포함된 문자열을 인용해야 합니다. 그렇지 않으면 셸에서 해석됩니다. (전임자.:echo '!Hello World!'
스크립트는 대화형 셸에서 실행되지 않으므로
udev
텍스트echo
는 어디에도 표시되지 않습니다. 스크립트가 실행 중인지 확인하려면 스크립트를 파일로 리디렉션하세요. (echo '!Hello World!' > /tmp/output_$(date +%s).txt
이$(date +%s)
섹션에서는 스크립트가 실행될 때마다 파일에 고유한 이름을 지정합니다.)
답변2
/home/michael
문제를 해결 하려면 스크립트를 이동하세요 . 나는 이것이 사용자 권한과 관련이 있다고 생각합니다.
개발 중에 터미널을 루트 사용자로 사용합니다. 내가 했던 것처럼 명령을 실행하면 /usr/bin
예상대로 작동합니다. udev가 루트 권한 없이 사용자로 실행되고 있다고 가정합니다.