udev 규칙에서 실행될 때 스크립트의 dd 명령이 실행되지 않습니다.

udev 규칙에서 실행될 때 스크립트의 dd 명령이 실행되지 않습니다.

디스크가 연결된 디스크 스테이션에 연결될 때 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.

관련 정보