저는 RHEL6을 실행 중이고 USB 장치를 삽입하고 제거할 때 트리거되는 udev 규칙을 작성하려고 합니다. 80-usb.rules
호출된 파일 을 생성 /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'