2014-05-14 2 views
5

Ho una serie di script di shell che eseguono i backup sul mio sistema utilizzando TrueCrypt e rsync. Voglio evitare ogni possibilità che questi vari script funzionino contemporaneamente.gregge (1) non riesce a rilasciare il blocco

Usano flock in una subshell, come descritto nel suo manuale:

(
    flock -n 9 || exit 1 
    # ... commands executed under lock ... 
) 9>/var/lock/mylockfile 

Tuttavia, il blocco viene sempre riesce ad acquisire per passaggi successivi (con stato di uscita 1).

Eppure fuser /var/lock/mylockfile e lsof /var/lock/mylockfile mostrano nulla.

Ora, se aggiungo il comando flock -u per sbloccare manualmente, in questo modo:

(
    flock -n 9 || exit 1 
    # ... commands executed under lock ... 
    flock -u 9 
) 9>/var/lock/mylockfile 

Poi gli script funzionano.

Sto usando flock correttamente? È sicuro chiamare flock -u all'interno del blocco?

proposito Gli script fastidiosi sono quelli che chiamano truecrypt all'interno del blocco di comando.

risposta

4

Il problema è che si sta eseguendo TrueCrypt in background, mantenendo il fd aperta. Dovresti chiudere il file fd per impedire che i processi in background si aggrappino al blocco.

Al posto del codice vero e proprio, ecco un banco di prova:

foo() { 
    ( 
    flock -n 9 && echo "ok" || { echo failed; exit 1; } 
    sleep 10 & 
) 9> lock 
} 
foo; foo 

# Output: 
# ok 
# failed 

sleep è biforcuta con fd 9 aperta, causando il blocco da tenere. Chiudiamo fd 9 quando backgrounding il processo:

foo() { 
    ( 
    flock -n 9 && echo "ok" || { echo failed; exit 1; } 
    sleep 10 9>&- & 
    #   ^-------- Right here 
) 9> lock 
} 
foo; foo 

# Output: 
# ok 
# ok 
+0

Impressionante, grazie! Sei davvero corretto. Ho chiuso il descrittore di file quando ho chiamato TrueCrypt (e rimosso le chiamate 'flock -u') e ora funziona perfettamente. – QuasarDonkey

0

file di blocco sono persistenti e si occupano di tutte le possibili condizioni di gara trasformerà il vostro script in un programma di shell complesso.

Date un'occhiata allo strumento Flom: http://sourceforge.net/projects/flom/

con qualcosa di simile:

flom -- my_first_command & 
flom -- my_second_command & 

è possibile li serializzare senza tutti gli effetti collaterali scure di serrature basati su file persistenti. Qui ci sono alcuni importanti esempi dei casi d'uso: http://sourceforge.net/p/flom/wiki/FLoM%20by%20examples/

Acclamazioni

Ch.F.