Avere un file aperto non è una serratura perché, se ogni processo deve prima controllare se il file è aperto e non procedere se lo è o crearlo/aprirlo se non lo è, allora due processi potrebbero benissimo controllare contemporaneamente, entrambi trovano che non è aperto, poi entrambi lo creano o lo aprono.
Per usare un file come serratura, l'operazione di check-and-lock deve essere una singola operazione ininterrotta. Questo si può ottenere in un filesystem Unix creando un file con modalità di sola lettura e rimuovendolo per sbloccarlo. Se il file esiste (ed è in sola lettura) la creazione del file fallirà, quindi si ottiene il check-and-lock in una singola operazione atomica.
Se il vostro processo di blocco è uno script di shell che verrà eseguito come demone, potete ottenere questo effetto usando umask
, un'impostazione per processo che imposta i permessi che i nuovi file vengono creati con:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask
Questo scrive anche il PID del processo di proprietà nel file, che risolve l'altro vostro problema: cat /var/lock/foo
Per quanto riguarda la domanda specifica “Quali processi hanno questo file aperto? ”, questo può essere utile quando si vuole smontare un filesystem, ma non può perché qualche processo ha un file aperto in esso. Se non si dispone di questi comandi, si può chiedere a /proc
come root:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'
o, come utente mortale:
&007