GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso determinare quale processo ha un file aperto in Linux?

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 $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$'


Linux
  1. Come creare, estrarre o aprire file RAR in Linux?

  2. Come determinare quale processo sta scrivendo su disco in Linux

  3. Come posso monitorare i dati su una porta seriale in Linux?

  4. Come posso sapere quali file ha aperto un processo?

  5. Come si determina quale tipo di socket della CPU ha un computer Linux?

Come aprire un file in Linux

Come determinare il tipo MIME di un file in Linux

Come modificare il limite di file aperti in Linux

Che cosa sono i collegamenti simbolici in Linux? Come creare collegamenti simbolici?

Come usare il comando lsof in Linux

Come sapere quale processo ha una porta specifica aperta su Linux?