장치가 연결된 상태로 컴퓨터를 시작할 때 USB 플래시 드라이브에 대한 udev 규칙을 실행합니다.

장치가 연결된 상태로 컴퓨터를 시작할 때 USB 플래시 드라이브에 대한 udev 규칙을 실행합니다.

특정 플래시 드라이브가 연결되면 Ubuntu 15.04 x64 서버 시스템에서 스크립트를 실행하고 싶습니다. 그래서 다음 내용으로 사용자 정의 규칙 파일을 만들었습니다.

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="my-vendor",ATTR{idProduct}=="my-id",RUN+="/var/scripts/my-script.sh"

플래시 드라이브가 연결될 때마다 스크립트가 실행되지만 두 가지 질문이 있습니다.

1) 드라이브가 연결된 상태에서 컴퓨터를 (다시) 시작하면 스크립트가 실행되지 않는 것 같습니다. 플래시 드라이브가 이미 연결되어 있는 경우 부팅 후 스크립트를 실행할 수 있는 방법이 있나요?

2) 스크립트에서는 디바이스를 마운트 하려고 하는데 이렇게 디바이스를 마운트 하려고 하면

mount LABEL=mylabel /some/path

또는

mount UUID=my-uuid /some/path

소스를 찾을 수 없습니다. 현재 나는

sleep 5s

내 스크립트에 추가했지만 이는 신뢰할 수 있는 솔루션이 아닌 것 같습니다. 시스템이 완전히 초기화될 때까지 기다리는 (내결함성) 방법이 있습니까?

테스트 목적으로 스크립트에는 다음만 포함됩니다.

#!/bin/sh
date >> /tmp/test.log

답변1

add장치가 존재하는 경우 시스템 시작 중에 동작 규칙이 실행됩니다. 이는 udevadm info --action=addSysVinit 시스템에서 실행하고 Upstart 또는 Systemd 시스템 내에서 실행하여 수행됩니다. 그러나 이는 루트 파일 시스템이 여전히 읽기 전용으로 마운트되고 파일 시스템이 아직 마운트되지 않은 경우 부팅 프로세스 초기에 발생합니다 /etc/fstab. /run그때쯤이면 가능했을지 모르겠네요 . 스크립트가 수행해야 하는 작업에 비해 너무 이른 단계일 수 있습니다.

/etc/rc.local시작 중에 스크립트를 실행하는 빠르고 지저분하지만 이식 가능한 방법은 조건에 따라 기존 장치에서 스크립트를 실행하는 것입니다 .

if [ -e /dev/disk/by-id/… ]; then
  /var/scripts/my-script.sh
fi

부팅 중에 장치가 연결되어 있으면 경쟁 조건이 발생할 수 있습니다. 장치가 감지되자마자 스크립트가 실행되고 /etc/rc.local.

더 깔끔한 해결책은 systemd 단위를 정의하고 스크립트에서 필요한 종속성을 선언하는 것입니다. 여전히 잠재적인 경쟁 상황에 주의해야 합니다.

관련 정보