Script Bash con problemas de bloqueo de carpetas para archivos grandes

Mi guion es:

#!/bin/bash

    # Path to a lock folder
LOCK_PATH="/Volumes/PROOFS_WATCH/copy.lock"

trap 'rmdir "$LOCK_PATH"; exit' 1 6 15

if mkdir "$LOCK_PATH"; then
    echo "Lock file did not exist and was created, Copying..."

        # Perform commands
    cp /Volumes/PROOFS_WATCH/*.mov /Volumes/PROOFS_WATCH/AME_Processing/
    cp /Volumes/PROOFS_WATCH/*.mov /Volumes/PROOFS_TV
    rm /Volumes/PROOFS_WATCH/*.mov 

        # Remove the lock
    rm -f "$LOCK_PATH"
fi

Mi salida es:

Lock file did not exist and was created, Copying...
cp: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
cp: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
rm: /Volumes/PROOFS_WATCH/*.mov: No such file or directory
rm: /Volumes/PROOFS_WATCH/copy.lock: is a directory
logout
[Process completed]

rm -fno elimina la carpeta de bloqueo por alguna razón...

Me gustaría que este script se ejecute automáticamente a través de Cron cada 60 segundos. Si se está escribiendo un archivo grande, no quiero que se ejecute hasta que se complete la escritura del archivo.

Me estoy dando cuenta más de lo que se puede hacer con bash y también quiero automatizar más procesos.

eliminar directorios rm -r o rmdir

Respuestas (1)

Reparar la eliminación de la cerradura

Intente usar rmdirpara eliminar la carpeta de bloqueo:

rmdir "$LOCK_PATH"

Rutas de depuración

Para depurar las cprutas, pruebe este comando en Terminal.app:

open /Volumes/PROOFS_WATCH/

¿Se abre la carpeta esperada? Juega con la ruta hasta que openmuestre la carpeta esperada en el Finder.

Para depurar la carpeta de bloqueo, intente ejecutar el script en dos ventanas de Terminal.app. ¿Ambos intentan y copian? Intentando agregar una declaración else para ver si mkdirfunciona como se desea:

else
    echo "Lock exists."
fi

Depuración de secuencias de comandos de Shell

Eche un vistazo a Cómo agregar la verificación de errores a sus scripts de Shell para ayudar a identificar cualquier problema.

Enlaces duros

En los comentarios a continuación se menciona una nueva restricción: otras aplicaciones pueden estar escribiendo los archivos mientras se ejecuta este script. Este script no puede bloquear otras aplicaciones que cambian o escriben en las carpetas afectadas.

Si se está escribiendo en un archivo, cpsolo verá y copiará un archivo parcial. La próxima vez que se ejecute el script, es probable que el archivo esté completamente disponible y se copie correctamente. Esto puede o no ser aceptable.

Si la copia se produce en el mismo volumen físico, es probable que se pueda evitar. En lugar de una copia, considere crear un enlace físico con la lnherramienta:

ln <source_file> <target_file>
ln [-Ffhinsv] <source_file> ... <target_dir>

El enlace no copia ningún dato y es casi instantáneo. Cambiar el archivo original o el nuevo archivo vinculado se reflejará en ambos.

Intente crear un enlace duro a mano antes de intentar cambiar el script:

ln /Volumes/PROOFS_WATCH/movie.mov /Volumes/PROOFS_WATCH/AME_Processing/movie.mov
Ok, entonces las rutas son buenas, rmdir funciona, todo funciona bien... pero cuando lo pruebo con un archivo grande, no evita que el script copie el archivo antes de que termine... Simplemente copia antes que el archivo la escritura está completa.
He actualizado la respuesta con una elsesugerencia y cómo agregar más verificación de errores. ¡Espero que esto ayude!
¡Hola Graham! ¡Así que lo revisé, verifiqué todo por error y ahora funciona perfectamente! ¡Fuiste extremadamente útil! Sin embargo, me di cuenta de que este script solo ofrece protección contra la ejecución del script, luego esperar una copia larga y luego ejecutar el script nuevamente. ¡Lo cual es genial! Y es una gran característica, pero me di cuenta de que mi problema aún existe porque si otra aplicación todavía está escribiendo mi archivo grande y el script se ejecuta, el script aún se ejecutará, creará la carpeta de bloqueo y copiará el archivo, lo que lo corromperá. . Creo que todavía tendré que usar LSOF o similar.
Marcaré esto como respondido y haré otra pregunta. ¡Gracias de nuevo! Realmente aprecio su esfuerzo y conocimiento.
Si los archivos están en el mismo volumen físico, intente reemplazar la copia con la creación de un vínculo físico . Esto puede ayudar a superar los archivos parcialmente escritos, suponiendo que la aplicación esté escribiendo los archivos en su lugar.
Todos los archivos están en un XSAN central. ¿Cómo puedo crear un vínculo físico y cómo evita eso la ejecución del script si el archivo aún se está escribiendo?
He añadido una sección sobre enlaces duros. Debería funcionar, pero pruebe primero antes de dedicar demasiado tiempo.