
저는 RHEL6을 실행 중이고 USB 장치를 연결하고 제거할 때 트리거되는 udev 규칙을 작성하려고 합니다. 나는 80-usb.rules
in 이라는 파일을 생성 /etc/udev/rules.d/
하고 여기에 다음 내용을 제공했습니다(아직까지 구체적인 내용은 없으므로 테스트하고 싶습니다).
ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
테스트를 위해 파일을 저장하고 USB 드라이브를 연결했습니다. 그러나 파일이 /tmp/test
생성되지 않았습니다.
udevadm info
USB 드라이브에서 실행할 수 있고 상위 장치 중 적어도 하나에 속성이 있으므로 udev 규칙이 USB 드라이브와 일치해야 한다고 생각합니다 SUBSYSTEMS=="usb"
.
udev 규칙이 트리거되지 않는 이유는 무엇입니까?
실행을 시도했는데 내가 작성한 파일이 처리되고 있고 내 규칙이 일치하고 있는 것이 udevadm test --action=add /path/to/device
분명했습니다 . .rules
다음은 출력의 몇 가지 관련 줄입니다.
parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
하지만 여전히 /tmp/test
존재하지 않습니다. 나 진짜 혼란 스럽다. 분명히 이 규칙이 일치하고 있으며 규칙이 적용되고 있습니다. 그렇다면 왜 실행으로 지정된 명령이 실행되지 않습니까 RUN
?
답변1
규칙은 실행 파일의 절대 경로를 제공해야 합니다.
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"
편집하다:
그리고 스크립트를 실행하려면 어떤 쉘이 스크립트를 실행할지 알려주어야 합니다.
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"
답변2
다음을 확인해야 합니다.
- 명령 의 경로는
RUN
절대 경로여야 합니다. - 파일은 실행 가능해야 합니다.
- 환경
PATH
은 명령 실행 내에서 제한됩니다.
처음에는 이 스크립트 파일을/lib/udev/touch.sh
vim /lib/udev/touch.sh
해당 파일에 다음을 작성하십시오.
#!/bin/bash
touch /tmp/test
실행 가능하게 만드세요:
chmod +x /lib/udev/touch.sh
규칙 파일을 다음과 같이 변경합니다.
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"
udev 규칙을 다시 로드하세요
udevadm control --reload-rules
그러면 규칙이 다시 읽혀집니다 /lib/udev/rules.d/*
. 지금까지는 변경사항이 적용되지 않습니다.
udev는 축소된 환경에서 스크립트를 실행합니다 PATH
. 구성된 경로 내에 없는 바이너리는 전체 경로를 사용하여 액세스해야 합니다. PATH
스크립트 내에서 환경을 확장할 수도 있습니다 .
set
래퍼 스크립트에서 로그 파일에 출력을 기록하여 정의된 경로를 확인하세요 .
set >>/tmp/udev-env-test
다음과 같이 보일 수 있습니다:
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'