Linux에 연결할 때 USB에 일부 파일을 쓰려고합니다.
실제로 다음과 같은 파일이 있습니다 /etc/udev/rules.d/
.
ACTION=="add", ENV{ID_FS_UUID}=="9FE8-99G3", RUN+="/usr/bin/sudo -u myuser /home/myuser/Scripts/mycrazy.sh"
에는 mycrazy.sh
다음이 있습니다.
## Path to mounted device
PATH_USB=/run/media/myuser/9FE8-99G3
mkdir $PATH_USB/some_folder
mkdir /home/myuser/Documents/another_folder
첫 번째 mkdir은 작동하지 않습니다. 그러나 두 번째는 작동합니다.
USB에 파일을 어떻게 쓸 수 있나요? 내 스크립트에 뭔가 빠졌나요?
답변1
나에게 맞는 것은 지연(
sleep
)과disown
중간 스크립트를 사용하여 지연이 있는 스크립트를 추가하는 것입니다.RUN{
type
}
... This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Starting daemons or other long running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.
원천:
man udev
여기에도 비슷한 경우가 있습니다:udevadm 트리거를 사용하면 udev 규칙이 실행되지만 부팅 시에는 실행되지 않는 이유는 무엇입니까?.Fëamarto의 답변여기 내 솔루션보다 나은 것 같습니다. 파일 시스템이
rw
모드에서 준비될 때까지 기다립니다. 시도해 볼 수도 있습니다.USB 드라이브이기 때문에 장착하기 전에 제거할 수 있습니다. 스크립트는 다음에 재부팅할 때까지 살아 있거나 다시 연결되어(다른 인스턴스를 트리거함) 마운트됩니다.
이 문제를 해결하는 한 가지 방법은 관련 항목이
/dev/sdxY
여전히 존재하는지 확인하는 것입니다. 각 사이클마다.내 설정은 다음과 같습니다.
/etc/udev/rules.d/99-sneetsher-tests.rules
ACTION=="add", ENV{ID_FS_UUID}=="6664-B2DA", RUN+="/usr/bin/sudo -u user /home/user/mycrazy.sh"
/home/user/mycrazy.sh
#!/bin/sh /home/user/mycrazy2.sh & disown
/home/user/mycrazy2.sh
#!/bin/sh PATH_USB=/media/user/MYFLASH3 sleep 5 mkdir $PATH_USB/some_folder