Udev 규칙이 실행되고 스크립트가 실패합니다.

Udev 규칙이 실행되고 스크립트가 실패합니다.

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을 .shbash#!/bin/sh

echo !Hello World!

  1. !은 특수 문자이므로 해당 문자가 포함된 문자열을 인용해야 합니다. 그렇지 않으면 셸에서 해석됩니다. (전임자.:echo '!Hello World!'

  2. 스크립트는 대화형 셸에서 실행되지 않으므로 udev텍스트 echo는 어디에도 표시되지 않습니다. 스크립트가 실행 중인지 확인하려면 스크립트를 파일로 리디렉션하세요. ( echo '!Hello World!' > /tmp/output_$(date +%s).txt$(date +%s)섹션에서는 스크립트가 실행될 때마다 파일에 고유한 이름을 지정합니다.)

답변2

/home/michael문제를 해결 하려면 스크립트를 이동하세요 . 나는 이것이 사용자 권한과 관련이 있다고 생각합니다.

개발 중에 터미널을 루트 사용자로 사용합니다. 내가 했던 것처럼 명령을 실행하면 /usr/bin예상대로 작동합니다. udev가 루트 권한 없이 사용자로 실행되고 있다고 가정합니다.

관련 정보