디스크가 연결된 디스크 스테이션에 연결될 때 DVD 디스크를 자동으로 복사하도록 Rasbian을 실행하는 Raspberry Pi 3를 설정하고 싶습니다. 이를 달성하기 위해 이 규칙이 트리거될 때 실행되는 udevrule과 스크립트를 작성했습니다.
udev 규칙은 제대로 작동하고 디스크가 삽입되면 스크립트를 실행하는 것 같습니다.
스크립트에는 dd
명령이 포함되어 있습니다. 명령줄에서 스크립트를 수동으로 실행하면 제대로 작동하고 명령이 실행됩니다 dd
. 그러나 디스크 삽입을 통해 스크립트를 실행하면 명령을 udev
제외한 스크립트의 모든 내용이 실행됩니다 .dd
온라인으로 검색했지만 같은 문제를 가진 다른 사람을 찾을 수 없습니다. 문제가 무엇인지 아는 사람이 있습니까?
udev 규칙 /etc/udev/rules.d/65-autorip.rules
:
SUBSYSTEM=="block", KERNEL=="sr[0-4]", ACTION=="change", RUN+="/usr/local/bin/autorip/autorip.sh /dev/%k %E{ID_CDROM_MEDIA}"
디스크 복사 스크립트 /usr/local/bin/autorip/autorip.sh
:
#!/bin/bash
# function to activate a led and eject disk when an error occurs
error(){
python /usr/local/bin/autorip/led-on.py
eject
}
# function to deactivate the led for
reset_led(){
python /usr/local/bin/autorip/led-off.py
}
# if udev flag to check if disk change action is insert (second script parameter) is set
if [ $2 == "1" ]; then
reset_led
#use wodim command to find out if disk is DVD
disk_info=$(wodim -atip dev='/dev/sr0')
if [[ $disk_info = *"mmc_mdvd"* ]] ; then
# copy disk contents to temp location (not working when ran from udev)
dd if=/dev/sr0 of=/tmp/autorip_disk_image_$RANDOM$RANDOM.iso
eject
else
error
fi
fi
답변1
udev
규칙은아니요DVD 복사와 같은 장기 실행 작업에 이상적입니다. 에서 man udev
:
이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.
데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.
또한 udev
스크립트는 다소 제한된 환경에서 실행되어 실행됩니다.
따라서 올바른 접근 방식은 사용자가 시작한 프로그램(D-Bus, 소켓, 명명된 파이프 또는 기타 수단을 통해)을 트리거한 다음 해당 프로그램이 DVD를 차례로 복사할 수 있는 udev 규칙을 만드는 것입니다. 이는 또한 DVD 복사 프로그램에 적절한 권한을 부여하는 문제를 해결합니다.
답변2
스크립트나 프로그램이 예상대로 작동하지 않을 때 디버깅 도구가 필요합니다. 스크립트의 상단에 다음 두 줄을 추가하여 수행 중인 작업을 문서화합니다.
set -x
exec >/tmp/debug-$$.out 2>&1
그런 다음 실행된 각 명령의 로그를 /tmp/ 디렉터리의 디버그 파일에 기록합니다. 내 추측으로는 스크립트가 실행되지 않을 뿐만 아니라 udev가 스크립트를 실행할 때 DVD를 볼 수 없기 때문에 다음 줄의 명령도 실행되지 않는다는 것을 알 수 있을 dd
것 입니다 eject
. wodim
이 문제는 sleep
이전에 충분히 추가하면 해결 될 수 있습니다.wodim.