Activar copia de archivo al insertar el dispositivo (sin depender de systemd)

0

Me gustaría tener automáticamente algunos archivos de un dispositivo de almacenamiento copiados en su inserción. Estoy buscando usar el mismo método en ambos sistemas que usan systemd y sistemas que usan scripts de inicio (por ejemplo, OpenRC en Gentoo). Además, buscaría no romper el montaje automático.

Según muchas otras preguntas relacionadas con este problema, esto se hace mejor a través de udev, y casi funciona, si no fuera por el udev Posthook que se ejecuta estrictamente antes del montaje automático (de una manera en la que udev verifica el estado de salida de cualquier script llamó y cualquier script que el script llame, por algún proceso que para mí me parece mágico):

La ejecución del script funciona, solo que el archivo no se puede copiar, porque (creo) el desencadenador automount espera a que el script de copia termine primero:

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

La adición de suspensión y el desvío de la ejecución del script a una subshell no parecen funcionar. El archivo no se vuelve accesible, porque ahora el montaje automático está completamente inhibido:

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/
TheChymera
fuente

Respuestas:

1

Esto es imposible de implementar (solo) con udev, porque udev solo vuelve a transmitir el evento "dispositivo agregado" después de que todas las reglas y todos los trabajadores hayan terminado en ese dispositivo. (Y el evento es lo que desencadena el automount, en general).

En lugar de reaccionar a los dispositivos, quieres reaccionar a nuevas monturas :

#!/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
grawity
fuente
¿Así que agrego esto como un servicio y lo mantengo funcionando a perpetuidad? Sin embargo, todavía me pregunto cómo udev puede realizar un seguimiento de los procesos huérfanos iniciados por sus trabajadores (incluso en subshells).
TheChymera