it-swarm-eu.dev

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

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

Quindi, come posso determinare quale processo ha un particolare file aperto in Linux? Preferibilmente un tipo one-liner o una particolare soluzione per strumenti Linux sarebbe ottimale.

119
Danny

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
53
Nathan Fellman

Sulla maggior parte dei sistemi Linux lsof NAME svolge 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]:~$
140
fin

Se vuoi sapere quale esatto descrittore di file del processo si collega al tuo file senza lsof o fuser - cerca attraverso /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

Sostituisci $1 con il nome file aperto che stai cercando. Puoi modificare -printf per tutto ciò che vuoi vedere, oppure reindirizzare in egrep -o '[0-9]+' | head -1 per l'uso con ps -Fp <pid> per le informazioni di quel processo.

La risposta $ lsof <filename> di @fin è la risposta migliore, ovviamente, ma per rispondere a @ il commento di JoseLSegura , se questo non è disponibile, la soluzione sopra è stata la mia risposta.

4
5upa

Ho scoperto che l'utilizzo della risposta accettata non elencava i processi che stavano usando la mia directory (ubuntu 14.04).

Alla fine, ho usato lsof (elenca i file aperti) e ho sfruttato l'output per trovare il processo incriminato:

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