Sulla maggior parte dei sistemi Linux lsof NAME fa il lavoro:
example@unixlinux.online:~$ 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
example@unixlinux.online:~$
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 $oldumask
Questo 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$'