2 votos

Bash script con problemas de carpeta de bloqueo para archivos grandes

Mi script 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 -f no elimina la carpeta de bloqueo por alguna razón...

Me gustaría que este script se ejecutara automáticamente vía Cron cada 60 segundos. Sin embargo, 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 quiero automatizar más procesos también.

1 votos

Para eliminar directorios rm -r o rmdir

1voto

Steve Evans Puntos 155

Fijación de la extracción de la cerradura

Pruebe a utilizar rmdir para eliminar la carpeta de bloqueo:

rmdir "$LOCK_PATH"

Depuración de rutas

Para depurar el cp prueba este comando en Terminal.app:

open /Volumes/PROOFS_WATCH/

¿Se abre la carpeta esperada? Juegue con la ruta hasta que open muestra la carpeta esperada en el Finder.

Para depurar la carpeta de bloqueo, intenta ejecutar el script en dos ventanas de Terminal.app. ¿Ambos intentan copiar? Prueba a añadir una sentencia else para ver si mkdir funciona como se desea:

…
else
    echo "Lock exists."
fi

Depuración de Shell scripts

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

Enlaces duros

Mencionado en los comentarios a continuación es una nueva restricción: otras aplicaciones pueden estar escribiendo los archivos como este script se está ejecutando. Este script no puede bloquear otras aplicaciones que cambien o escriban en las carpetas afectadas.

Si se está escribiendo en un archivo, la función cp sólo verá y copiará un archivo parcial. La próxima vez que se ejecute el script, es probable que el archivo esté totalmente disponible y se copie correctamente. Esto puede ser aceptable o no.

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

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

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

Intenta 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

0 votos

Ok, así que las rutas son buenas, rmdir funciona, todo funciona bien ... pero cuando lo pruebo con un archivo grande, no se detiene el script de copiar el archivo antes de su hecho ... Simplemente copia antes de que se complete la escritura del archivo.

0 votos

He actualizado la respuesta con un else sugerencia y cómo añadir más comprobación de errores. Espero que esto ayude.

0 votos

¡Hola Graham! ¡Así que he ido a través, error comprobado todo, y su funcionando perfectamente ahora! ¡Usted fue extremadamente útil! Sin embargo, me he dado cuenta de que este script sólo ofrece protección contra la ejecución de la script, a continuación, esperar a que una copia larga, entonces el script ejecutar de nuevo. Lo cual está muy bien. Y es una gran característica para tener, pero me di cuenta de que mi problema sigue existiendo porque si mi archivo grande todavía está siendo escrito por otra aplicación y el script se ejecuta el script todavía se ejecutará, creará la carpeta de bloqueo, y copiará el archivo, corrompiéndolo así. Creo que todavía tendré que usar LSOF o similar.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X