udev aciona a regra, mas o script falha ao executar corretamente

3

Estou tentando automatizar um backup rápido e sujo de um sistema sem cabeçalho. (Sinto que é relevante observar que estou executando os utilitários do Busybox, então essa é a ferramenta de montagem que tenho à minha disposição) Fiz uma regra do udev para executar um script quando meu dispositivo USB está conectado e ele aciona e executa o script chamado.

Atualmente, o script apenas monta o dispositivo, mas não consegue fazê-lo. Se eu executar o script manualmente, não haverá erro. Eu adicionei a linha exec >/home/user/udev.out 2>&1 para tentar descobrir por que está falhando.

Conteúdo do script:

#!/bin/sh
exec >/home/user/udev.out 2>&1
mount -t ntfs-3g /dev/sdb1 /mnt/backup
exit 0

Eu sei que não devo usar / dev / sdb1 no script, e eu gero um link simbólico na regra do udev, mas apenas para verificação de erros eu codifiquei o dispositivo.

Eu também tentei adicionar uma suspensão de 3 segundos antes do comando mount para ter certeza de que o dispositivo poderia ser detectado pelo sistema antes de executar o comando de montagem, sem sucesso.

Resultados de udev.out:

mount: mounting /dev/sdb1 on /mnt/backup failed: No such device

Eu sei que o dispositivo está lá e está listado pelo fdisk. Se eu chamar o script do shell, ele será executado com sucesso, sem problemas.

Alguém já encontrou algo parecido antes? Não sei como proceder.

edite: regra do udev:

SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", SYMLINK+="kingston%n"
SUBSYSTEM=="usb", ATTRS{serial}=="serialforusbdrive", RUN+="/usr/local/bin/backup.sh"

edite: Esclarecimento: A regra do udev dispara e executa meu script. O script quando executado manualmente a partir do shell (eu digito /usr/local/bin/backup.sh no shell e a unidade está montada) O script quando executado pela regra do udev (RUN +="/ usr / local / bin / backup.sh") executa o script, mas falha ao montar a unidade.

    
por user2894937 11.04.2014 / 21:40

1 resposta

2

Eu finalmente resolvi esse problema.

O problema, penso eu, tem a ver com o timing de tudo.

Alterei minhas regras do udev para ambas no mesmo subsistema

SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", SYMLINK+="kingston%n"
SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", RUN+="/usr/local/bin/backup.sh"

Em seguida, adicionamos as seguintes linhas ao início do script.

sleep 5
stat /dev/kingston1

Eu acho que o tempo estava um pouco errado e ele tentaria montar antes que o disco estivesse pronto, e o subsistema "usb" estivesse disparando antes do subsistema "block", então meu symlink não existia quando o script realmente correu.

    
por 15.04.2014 / 17:29