Avere un file aperto non è un blocco perché, se ogni processo deve verificare se il file è aperto per primo e non procedere se lo è o crearlo / aprirlo se non lo è, allora due processi potrebbero controllare abbastanza contemporaneamente, entrambi trovano che non è aperto, quindi sia crearlo che aprirlo.
Per utilizzare un file come blocco, l'operazione di verifica e blocco deve essere un'unica operazione ininterrotta. Puoi farlo in un filesystem Unix creando un file con modalità di sola lettura e rimuovendolo per sbloccare. Se il file esiste (ed è di sola lettura) la creazione del file fallirà, quindi otterrai un controllo e un blocco in una singola operazione atomica.
Se il processo di blocco è uno script shell che verrà eseguito come daemon, è possibile ottenere questo effetto utilizzando umask
, un'impostazione per processo che imposta le autorizzazioni con cui vengono creati i nuovi file:
oldumask = $ (umask)
umask 222 # crea file non scrivibili anche per il proprietario
se echo $$> / var / lock / foo
poi
: blocco riuscito
altro
: blocco fallito
fi
umask $ oldumask
Questo scrive anche il PID del processo proprietario nel file, risolvendo l'altro problema:
cat /var/lock/foo
Per quanto riguarda la domanda specifica "Quali processi hanno questo file aperto?", Questo può essere utile quando si desidera smontare un filesystem ma non è possibile perché in alcuni processi è aperto un file. Se non hai questi comandi disponibili, puoi chiedere
/proc
come root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
o, come utente mortale:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'