dd comando no script não executado quando executado a partir da regra do udev

1

Eu gostaria de configurar um Raspberry Pi 3 executando o Rasbian para copiar automaticamente um disco de DVD quando um disco é inserido em uma estação de disco acoplada. Para conseguir isso, escrevi um udevrule e um script para executar quando esta regra é acionada.

A regra do udev parece funcionar bem e executa o script quando o disco é inserido.

O script contém o comando dd . Quando executo o script manualmente a partir da linha de comando, ele funciona corretamente e executa o comando dd . Quando o script é executado por udev na inserção do disco, no entanto, tudo no script é executado, exceto o comando dd .

Eu pesquisei on-line, mas não consegui encontrar mais ninguém com o mesmo problema. Alguém tem uma idéia do problema?

regra do 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}"

script de cópia de disco /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
    
por Arne Van Den Kerchove 15.04.2018 / 17:45

2 respostas

2

As regras udev são não destinadas a tarefas de execução mais longa, como a cópia de um DVD. De man udev :

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.

Além disso, os scripts executados por udev são executados em um ambiente restrito.

Portanto, a maneira correta de fazer isso é criar uma regra do udev que acione um programa que já tenha sido iniciado pelo usuário (via D-Bus, um soquete, um pipe nomeado ou outro); este programa pode então copiar o DVD. Isso também resolve o problema de conceder permissões adequadas ao programa de cópia de DVD.

    
por 15.04.2018 / 21:18
0

Quando um script ou programa não faz o que você acha que deve fazer, é hora de sair das ferramentas de depuração. No script, adicione as duas linhas seguintes na parte superior para registrar o que está fazendo:

set -x
exec >/tmp/debug-$$.out 2>&1

Em seguida, ele gravará um log de cada comando executado em um arquivo de depuração no diretório / tmp /. Meu palpite é que você verá que o script não só não executa dd , mas também o comando eject na próxima linha, porque o comando wodim não vê o DVD no momento em que o script é executado por udev. Isso provavelmente pode ser corrigido adicionando um sleep suficiente antes do wodim.

    
por 15.04.2018 / 18:16