2010-01-19 16:08:15 +0000 2010-01-19 16:08:15 +0000
127
127

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

Vorrei determinare quale processo ha la proprietà di un lock-file. I lock-file sono semplicemente un file con un nome specifico che è stato creato.

Allora, come posso determinare quale processo ha un particolare file aperto in Linux? Preferibilmente un tipo di file singolo o una particolare soluzione di strumenti Linux sarebbe ottimale.

Risposte (4)

146
146
146
2010-01-19 16:18:03 +0000

Sulla maggior parte dei sistemi Linux lsof NAME fa il lavoro:

fin@r2d2:~$ 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
fin@r2d2:~$
56
56
56
2010-01-19 17:37:11 +0000

È possibile utilizzare fuser anche 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
9
9
9
2010-01-20 13:14:12 +0000

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

2
2
2
2015-10-30 14:21:35 +0000

Ho scoperto che utilizzando la risposta accettata non elencavo i processi che utilizzavano la mia directory ( ubuntu 14.04 ).

Alla fine, ho usato lsof (elenca i file aperti) e ho saltato il suo output per trovare il processo offensivo:

lsof | egrep "<regexp-for-your-file>"