Sulla maggior parte dei sistemi Linux lsof NAME
fa il lavoro:
[email protected]:~$ lsof /home/fin
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 21310 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21320 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21321 fin cwd DIR 8,1 4096 5054467 /home/fin
[email protected]:~$
Puoi anche usare fuser
per questo:
~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc: 28135
~> ps 28135
PID TTY STAT TIME COMMAND
28135 pts/36 T 0:00 less .vimrc
Avere un file aperto non è un blocco perché, se ogni processo deve controllare prima se il file è aperto e non procedere se lo è o crearlo/aprirlo se non lo è, allora due processi potrebbero benissimo controllare simultaneamente, entrambi trovare che non è aperto, allora entrambi lo creano o lo aprono.
Per utilizzare un file come blocco, l'operazione di controllo e blocco deve essere un'unica operazione non interrompibile. Puoi ottenere ciò in un filesystem Unix creando un file con modalità di sola lettura e rimuovendolo per sbloccarlo. Se il file esiste (ed è di sola lettura) la creazione del file fallirà, quindi otterrai il controllo e il blocco in una singola operazione atomica.
Se il tuo processo di blocco è uno script di shell che verrà eseguito come demone, puoi ottenere questo effetto usando umask
, un'impostazione per processo che imposta le autorizzazioni con cui vengono creati i nuovi file:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ > /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumaskQuesto scrive anche il PID del processo proprietario nel file, il che risolve l'altro tuo problema:
cat /var/lock/foo
Per quanto riguarda la domanda specifica "Quali processi hanno questo file aperto?", questa può essere utile quando si vuole smontare un filesystem ma non si può perché qualche processo ha un file aperto al suo interno. Se non hai questi comandi disponibili, puoi chiedere /proc
come radice:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
o, come utente mortale:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'