Cópia do arquivo do acionador na inserção do dispositivo (sem depender do systemd)

0

Eu gostaria de ter automaticamente alguns arquivos de um dispositivo de armazenamento copiado em sua inserção. Eu estou olhando para usar um e o mesmo método em ambos os sistemas que usam systemd e sistemas usando scripts de inicialização (por exemplo, OpenRC no Gentoo). Além disso, eu procuraria não quebrar a montagem automática.

Eu me reúno em muitas outras questões que lidam com essa questão que é melhor feito via udev, e isso quase funciona, se não para o udev posthook ser executado estritamente antes do automount (de uma maneira em que o udev verifica o status de saída de qualquer script que ele chama e qualquer script que o script chame, por algum processo que para mim pareça mágica):

A execução do script funciona, apenas porque o arquivo não pode ser copiado, porque (acredito) o disparo do automount espera que o script de cópia termine primeiro:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules 
ACTION=="add", KERNEL=="sd?1", ENV{ID_FS_UUID}=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/4C3D-8BCB.sh"
chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh 
#!/usr/bin/env bash

touch ~/lalax.txt
cp "/run/media/chymera/NIKON D750/lala.txt" ~/
chymera@quiethost ~/.repositorg/transfer $ ls ~/lal*
/home/chymera/lalax.txt
chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/NIKON\ D750/
DCIM  lala.txt  NIKON001.DSC

Adicionar suspensão e desviar a execução do script para um subshell não parece funcionar. O arquivo não se torna acessível, porque agora o automount é totalmente inibido:

chymera@quiethost ~/.repositorg/transfer $ cat /etc/udev/rules.d/95-local.rules 
ACTION=="add", KERNEL=="sd?1", ENV{ID_FS_UUID}=="4C3D-8BCB", RUN+="/bin/su chymera -c /home/chymera/.repositorg/transfer/_4C3D-8BCB.sh"
chymera@quiethost ~/.repositorg/transfer $ cat _4C3D-8BCB.sh 
#!/usr/bin/env bash

nohup /bin/bash /home/chymera/.repositorg/transfer/4C3D-8BCB.sh & exit
chymera@quiethost ~/.repositorg/transfer $ cat 4C3D-8BCB.sh 
#!/usr/bin/env bash

touch ~/lalax.txt
sleep 5
cp "/run/media/chymera/NIKON D750/lala.txt" ~/
chymera@quiethost ~/.repositorg/transfer $ ls ~/lal*
/home/chymera/lalax.txt
chymera@quiethost ~/.repositorg/transfer $ ls /run/media/chymera/
    
por TheChymera 05.07.2018 / 00:12

1 resposta

1

Isso é impossível (sanamente) implementar apenas com o udev, porque o udev somente retransmite o evento "dispositivo adicionado" após todas as regras e todos os trabalhadores terem terminado nesse dispositivo. (E o evento é o que desencadeia automount, geralmente.)

Em vez de reagir aos dispositivos, você quer reagir a novas montagens :

#!/usr/bin/env bash

wanted_dir="/run/media/chymera/NIKON D750"

findmnt -o action,target -r -n --poll |
    while read -r eaction etarget; do
        if [[ "$eaction" == mount && "$etarget" == "$wanted_dir" ]]; then
            cp this that etc.
        fi
    done
    
por 05.07.2018 / 15:00