편집하다:

편집하다:

udev저는 무선 카드가 연결되어 있을 때 데비안 시스템을 사용하여 bash 스크립트를 실행하려고 했습니다 .

지금까지 다음 파일을 만들었습니다 /etc/udev/rules.d/wifi-detect.rules.

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"

이제 나는 test.sh이것들을 작동시키려고 노력하고 있습니다:

#!/bin/bash
/bin/echo "test!" > /test.txt

그런데 무슨 이유에서인지 무선 카드를 연결해도 아무 일도 일어나지 않는 것 같고 test.txt파일도 생성되지 않습니다.

lsusb카드에:

Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n

카드를 연결하면 udevadm monitor –env다음이 실행됩니다.

KERNEL[1017.642278] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
KERNEL[1017.644676] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1017.645035] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
KERNEL[1017.708056] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.714772] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
UDEV  [1017.733002] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.772669] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.798707] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1018.456804] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
KERNEL[1018.465994] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan0 (net)
KERNEL[1018.479878] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
KERNEL[1018.483074] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
UDEV  [1018.600456] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
UDEV  [1018.604376] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
UDEV  [1018.626243] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
KERNEL[1018.659318] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.758843] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.932207] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)

많은 예제를 시도했지만 제대로 작동하지 않습니다. 누군가가 이 문제를 해결하는 데 도움을 줄 수 있기를 바랍니다. ;) 감사합니다!


편집하다:

일을 단순화하기 위해 규칙을 다음과 같이 변경했습니다.

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"

@user1146332가 제안한 대로 설정했고 udevadm control --log-priority=info다음과 같은 흥미로운 로그를 얻었습니다.

Sep  9 16:27:53 iklive-rpi1 udevd[1537]: RUN '/bin/echo 'test' > /test.txt' /etc/udev/rules.d/wifi-detect.rules:1
Sep  9 16:27:53 iklive-rpi1 udevd[1544]: starting 'firmware.agent'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 queued, 'remove' 'firmware'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 forked new worker [1547]
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: 'firmware.agent' [1544] exit with return code 0
Sep  9 16:27:53 iklive-rpi1 udevd[1548]: starting '/bin/echo 'test' > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 running
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: no db file to read /run/udev/data/+firmware:1-1.3.4: No such file or directory
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: passed -1 bytes to netlink monitor 0x1af5ee0
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 done with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 processed with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt'(out) 'test > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt' [1548] exit with return code 0

그럼... return code 0종료코드는 성공적인 완료 아닌가요? 그렇다면 내 시스템에 파일이 전혀 없는 이유는 무엇입니까?


편집 2:

@htor의 팁을 사용하여 이 작업을 수행했습니다. 내 현재 규칙:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"

그런데 어떤 이유에서인지 명령이 8번 실행되는데, 이를 피할 수 있는 방법이 있나요? 무선 카드 드라이버가 로드될 때 실제로 카드를 제거하고 설치해야 하기 때문에 이런 일이 발생한다고 생각합니다. 팁?

답변1

나는 한때유제얼마 전 해결책은 RUN+=섹션을 로 변경하는 것이었습니다 RUN+="sh -c '/root/test.sh'". 이제 규칙은 명령이 아닌 스크립트를 호출하는 것이므로 이 경우에 필요한지 모르겠습니다.

!또 다른 관찰: 문자열에서 "test!"큰따옴표를 제거하거나 작은따옴표로 바꾸 십시오. 폭발은 !셸에서 특별한 의미를 가지며 큰따옴표로 인해 해당 의미가 유지되므로 문제가 발생할 수 있습니다.

답변2

내 제안은 로깅 우선 순위를 udev에서 다음 으로 설정하는 것입니다.errinfo

 udevadm control --log-priority=info

더 많은 정보를 보고 싶다면 로 설정하세요 debug. 이제 매우 자세한 udev정보를 찾을 수 있습니다 /var/log/daemon.log(적어도 데비안 관련 시스템에서는). 일반적으로 이는 오류를 추적하는 데 많은 도움이 됩니다.

이것은 htor의 답변에 추가된 것일 뿐이며 문제를 해결할 수도 있습니다.

관련 정보