Eu tenho um script configurado para ser executado quando uma determinada unidade USB for inserida. É suposto copiar uma pasta da unidade USB para uma pasta de backup e escrever sobre esta pasta, se ela já existir. No entanto, quando conecto meu drive USB, ele cria a pasta, mas não copia nenhum arquivo.
Meu .rules é assim:
ACTION=="add", ATTR{idVendor}==Vendor, ATTR{idProduct}==Product, RUN+="/bin/sh /path/to/file/mkBackup"
Meu arquivo mkBackup fica assim:
#!/bin/bash
a="/path/to/file/Backup"
if [ -e $a ]; then
rm -rf $a
fi
mkdir $a
cp -r /path/to/usb/folder $a
Quando ele é executado udev
, a pasta Backup é criada, mas fica vazia, mas quando eu apenas executo ./mkBackup
, a pasta é criada e tudo é copiado. Esta é a primeira vez que udev
faço algo assim, então, por favor, me perdoe se isso parece uma pergunta simples. Agradeço antecipadamente.
Responder1
Dado que a pasta Backup foi criada, você sabe que o script é executado com sucesso quando você conecta o dispositivo. Suspeito que o script esteja sendo executadoanteso dispositivo realmente termina a montagem. Portanto, os arquivos ainda não estão disponíveis para cp
.
O que acontece se você adicionar sleep 5
depois mkdir $a
? Ou e se você tentar copiar os arquivos existentes?
Esse linktambém é muito útil como referência.
Eu também uso:
udevadm monitor --udev
Para assistir aos eventos do udev em tempo real.
udevadm test /path/to/dev
Para simular um evento udev executado para o dispositivo. Observe que isso faznãoexecute qualquer programa especificado por uma chave RUN.
EDITAR:Como Gilles ressalta, minha ideia não funcionará. E não tenho conhecimento de uma solução. Aqui está o porquê:
O Udev disponibilizará o dispositivo USB para o sistema operacional. Então, o sistema operacional perceberá que contém um sistema de arquivos montável e o montará. Nesse ponto, os arquivos do dispositivo USB estão realmente disponíveis.
Qualquer script executado por uma regra do udev será executadoanteso sistema de arquivos está realmente montado. Se eu pensar em uma alternativa atualizarei o post.