특정 플래시 드라이브가 연결되면 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=add
SysVinit 시스템에서 실행하고 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 단위를 정의하고 스크립트에서 필요한 종속성을 선언하는 것입니다. 여전히 잠재적인 경쟁 상황에 주의해야 합니다.