USB 장치 플러그인에서 사용자 지정 스크립트를 실행하는 방법은 무엇입니까?


41

Debian / CentOS / Fedora와 같은 현재 Linux 배포 환경에서 USB 장치 플러그인에서 사용자 지정 스크립트를 자동으로 실행하는 최첨단 방법은 무엇입니까?

예를 들어, UUID (또는 장치 ID 등)를 기반으로 일부 파일을 자동으로 마운트 / 복사하거나 USB 대용량 저장 장치를 마운트 해제하려는 경우.

답변:


27

파일에 /etc/udev/rules.d다음 과 같은 줄을 넣으십시오 .

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

NAME="subdir/mydisk%n"아래에 사용자 정의 입력 경로를 사용하려는 경우 와 같은 절을 추가하십시오 /dev.

실행할 udevadm info -a -n sdb수있는 속성을 확인하려면 실행 하십시오 ( attribute=="value"; 플러그 할 때 sdb작성된 새 항목에 따라 디스크에 자동으로 할당 된 장치 이름으로 대체 /dev). 하나의 스탠자 ATTRS에서 절을 사용할 수 있습니다 . 모든 스탠자를 선택할 수 있지만 절은 모두 동일한 스탠자에서 가져와야하므로 혼합하여 일치시킬 수 없습니다. 다른 스탠자에 나열된 다른 유형의 절과 절을 혼합 할 수 있습니다 .ATTRSATTRS


1
이 답변은 여전히 ​​유효합니까? 아무리 적은 양으로도 스크립트를 실행하고 파일을 만질 수 있습니다. 무언가 를 꽂았을 때 스크립트를 실행하는 가장 기본적인 예를 제공 할 수 있다면 훌륭 할 것입니다.
Redsandro

@ Redsandro 내 udev 구성 에서이 규칙의 변형이 있으며 작동합니다. 장치를 껐다가 다시 연결 했습니까 udevadm trigger? 시스템이 udev를 사용합니까? 무언가가 연결되어있을 때 스크립트를 실행하려면 모든 조건 (with 절 ==)을 제거하십시오 (구문에는 하나의 조건이 필요할 수도 있지만 확실하지 않습니다 KERNEL=="*".
Gilles 'SO- 악마 그만해'

나도 그것을 시도했지만 그것이 효과가 있기 때문에 한 걸음도 빠져 있어야합니다. 내가있는 여기이 질문에 이동 , 그래서 나는 예제 코드를 작성할 수 있습니다.
Redsandro

아마도 관련이 있다고 생각합니다. 스크립트 실행 시간에 시간 제한이 있다고 생각합니다. 나는 그것이 매우 짧다고 생각합니다 (1 초 정도). 그것보다 오래 걸리면 udev가 그것을 죽일 것입니다. 스크립트와 배경을 사용하여이 문제를 해결할 수 있습니다 at. "외부 프로그램을 실행"을 참조하십시오 reactivated.net/writing_udev_rules.html
cheshirekow

이것에 추가하기 위해, 완전성을 위해 파일에는 접미사가 있어야 .rules하고 디렉토리의 파일은 어휘 순서 (컨벤션은 숫자 접 두부를 사용하여 순서대로)로 읽으며 /etc/, /usr/lib또는 아래에있을 수 있습니다 /run. 자세한 내용은 RTFM 입니다.
starfry

14

/lib/udev/rules.d디스크 관련 규칙의 예를 살펴 보았습니다 . Ubuntu 시스템에서 하나의 규칙 파일은 ID_FS_UUID_ENC자체 규칙 파일에서 사용할 수 있는 환경 변수 를 제공 합니다.

따라서 사용자 지정 규칙 파일을에 배치했습니다 /etc/udev/rules.d/foodevice.rules. 숫자가 앞에 붙지 않기 때문에 마침내 udev에 의해 실행됩니다. Btw에서 udev 데몬은 /etc/udev/rules.d파일 변경시 다시 시작할 필요가없는 변경 사항을 감시 했습니다.

내용 /etc/udev/rules.d/foodevice.rules은 :

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(이것은 하나의 규칙입니다-udev에는 줄 연속 메커니즘이 없기 때문에 ENV 절 뒤에 줄 바꿈을 제거해야합니다)

udev로 시작한 프로그램은 데몬을 차단하므로 오랫동안 실행하지 않아야합니다. 나는 그것을 통해 at, 즉 실제 작업을 수행하는 프로세스에서 분리 하여 해결했습니다 .

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
udevadm control --reload-rules배포판에 따라를 사용하여 udev 규칙을 다시로드해야 할 수도 있습니다 .
user44038

1
대신에 at now나는 제안한다 batch.
Reinstate Monica-M. Schröder

당신은 어느 때해야 할 일 at이나 batch? busybox 와 함께 임베디드 환경에 있습니다.
natenho

@natenho, 당신은 사용할 수 있습니다 ~/path/mountcopystuff.sh &- at등은 무언가 잘못되었을 때 이메일 알림을받을 수 있다는 이점이 있습니다. 그러나 임베디드 시스템에서는 아마도별로 관심이 없습니다.
maxschlepzig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.