Script Bash con problemi di cartelle bloccate per file di grandi dimensioni


2

La mia sceneggiatura è:

#!/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

La mia uscita è:

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 non rimuove la cartella di blocco per qualche motivo ...

Vorrei che questo script venisse eseguito automaticamente tramite Cron ogni 60 secondi. Se viene scritto un file di grandi dimensioni, anche se non voglio che venga eseguito fino al completamento della scrittura del file.

Sto realizzando di più di ciò che si può fare con bash e voglio anche automatizzare più processi.


1
rimuovi le directory rm -r o rmdir
Mark

Risposte:


1

Correzione della rimozione del blocco

Prova a utilizzare rmdirper rimuovere la cartella di blocco:

rmdir "$LOCK_PATH"

Percorsi di debug

Per eseguire il debug dei cppercorsi, prova questo comando in Terminal.app:

open /Volumes/PROOFS_WATCH/

La cartella prevista si apre? Gioca con il percorso fino a quando non openviene visualizzata la cartella prevista nel Finder.

Per eseguire il debug della cartella di blocco, prova a eseguire lo script in due finestre Terminal.app. Provano entrambi a copiare? Prova ad aggiungere un'istruzione else per vedere se mkdirfunziona come desiderato:


else
    echo "Lock exists."
fi

Debug degli script Shell

Dai un'occhiata a Come aggiungere il controllo degli errori agli script della shell per identificare eventuali problemi.

Hard Links

Citato nei commenti qui sotto c'è un nuovo vincolo: altre applicazioni potrebbero scrivere i file mentre questo script è in esecuzione. Questo script non può bloccare altre applicazioni che cambiano o scrivono nelle cartelle interessate.

Se si sta scrivendo un file, cpvedrà e copierà solo un file parziale. Alla successiva esecuzione dello script, il file sarà probabilmente completamente disponibile e copiato correttamente. Questo può essere o non essere accettabile.

Se la copia si trova sullo stesso volume fisico, è probabile che la copia possa essere evitata. Al posto di una copia, considera la possibilità di creare un collegamento reale con lo lnstrumento:

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

Il collegamento non copia alcun dato ed è quasi istantaneo. La modifica del file originale o del file appena collegato verrà riflessa in entrambi.

Prova a creare manualmente un collegamento reale prima di provare a modificare lo script:

ln /Volumes/PROOFS_WATCH/movie.mov /Volumes/PROOFS_WATCH/AME_Processing/movie.mov

Ok, quindi i percorsi sono buoni, rmdir funziona, tutto funziona bene ... ma quando lo collaudo con un file di grandi dimensioni, non impedisce allo script di copiare il file prima che sia terminato ... Copia solo prima del file la scrittura è completa.
Brian

Ho aggiornato la risposta con un elsesuggerimento e come aggiungere ulteriori controlli degli errori. Spero che sia di aiuto!
Graham Miln,

Ehi Graham! Quindi ho passato, l'errore ha controllato tutto e ora funziona perfettamente! Sei stato estremamente utile! Tuttavia Ive ha capito che questo script offre solo protezione contro l'esecuzione dello script, quindi in attesa di una copia lunga, quindi lo script viene eseguito nuovamente. Che è grandioso! Ed è una grande funzionalità da avere, ma mi sono reso conto che il mio problema esiste ancora perché se il mio file di grandi dimensioni viene ancora scritto da un'altra applicazione e lo script viene eseguito lo script verrà comunque eseguito, creerà la cartella di blocco e copierà il file, corrompendolo così corrompendolo . Penso che dovrò ancora usare LSOF o simili.
Brian,

Contrassegnerò come risposta e farò un'altra domanda. Grazie ancora! Apprezzo molto i tuoi sforzi e le tue conoscenze.
Brian,

Se i file si trovano sullo stesso volume fisico, provare a sostituire la copia con la creazione di un collegamento reale . Questo può aiutare a superare i file scritti parzialmente - supponendo che i file vengano scritti sul posto dall'applicazione.
Graham Miln,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.