Script Bash - Ritarda il comando cp fino al completamento della scrittura del file

1
cp /Folder1/*.mov /Folder2/
cp /Folder1/*.mov /Folder3
rm /Folder1/*.mov

Viene eseguito ogni 60 secondi utilizzando Chron che copia qualsiasi file * .mov da una cartella in altre 2 cartelle e quindi rimuove il file.

Se il file impiega più di 60 secondi per scrivere, lo script viene eseguito e copia qualsiasi cosa nella cartella e la corrompe. (O se lo script si verifica esattamente quando viene scritto un file.)

Come posso creare un'istruzione condizionale per far sì che lo script aspetti fino al completamento della scrittura del file?

    
posta Brian 03.08.2015 - 15:56
fonte

1 risposta

2

Blocca file

Considera di creare un blocco per prendere nota della copia in corso, vedi bloccare lo script (contro l'esecuzione parallela) :

#!/bin/sh

# Path to a lock folder
LOCK_PATH="/tmp/copying.lock"

# Ensure the lock is removed should the copy fail
trap 'rmdir "/tmp/copying.lock"; exit' 1 6 15

if mkdir "$LOCK_PATH"; then
    # Lock file did not exist and was created

    # Perform commands
    cp /Folder1/*.mov /Folder2/
    cp /Folder1/*.mov /Folder3
    rm /Folder1/*.mov   

    # Remove the lock
    rmdir "$LOCK_PATH"
fi

Lo script sopra riportato viene copiato solo se non esiste alcuna cartella in /tmp/copying.lock .

Copia e sposta

Invece di copiare direttamente nella posizione finale, prendi in considerazione la possibilità di creare la copia in una posizione temporanea. Quindi sposta i file. Una mossa è veloce, tende ad essere atomica e meno probabilità di danneggiare i file.

In alternativa, puoi copiare usando uno strumento come rsync che include i flag per proteggere da questi problemi.

    
risposta data 04.08.2015 - 15:24
fonte

Leggi altre domande sui tag