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

Vorrei determinare quale process ha la properties; di un file di block. I file di block sono semplicemente un file con un nome specifico creato.

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

È inoltre ansible utilizzare 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 

Nella maggior parte dei sisthemes 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]:~$ 

Avere un file aperto non è un block perché, se each process deve verificare se il file è aperto innanzitutto e non procedere se è oppure creare / aprire se non lo è, allora due processi potrebbero ben verificare contemporaneamente, entrambi trovano che non sia aperto, quindi crei o apri.

Per utilizzare un file come block, l'operazione di controllo e block deve essere un'unica operazione non interrotta. È ansible get questo risultato in un filesystem Unix creando un file con modalità di sola lettura e rimuovendolo per sbloccare. Se il file esiste (ed è solo in lettura), la creazione di file non riesce, in modo da get il check-and-lock in un'unica operazione atomica.

Se il process di block è uno script di shell che verrà eseguito come daemon, è ansible get questo effetto utilizzando l' umask , un'impostazione per process che imposta le autorizzazioni che creano i nuovi file con:

 oldumask = $ (umask)
 umask 222 # crea file indispensabili anche al proprietario
 se echo $$> / var / lock / foo
 poi
     : il block è riuscito
 altro
     : il block non è riuscito
 fi
 umask $ oldumask

Questo scrive anche il process di possesso 'PID nel file, che risolve il tuo altro problema: cat /var/lock/foo


Per quanto riguarda la domanda specifica "Quale process ha questo file aperto?", Questo può essere utile quando si desidera smontare un filesystem ma non può perché alcuni processi hanno un file aperto in esso. Se non disponete di questi comandi, puoi richiedere /proc come root:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

o, come utente mortale:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'

Se vuoi sapere quale file del descrittore di file di process esatto si collega al 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 di file aperto che stai cercando. Puoi modificare il -printf per quello che vuoi vedere, o piombo in egrep -o '[0-9]+' | head -1 egrep -o '[0-9]+' | head -1 per l'uso con ps -Fp <pid> per le informazioni di quel process.

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

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

Alla fine ho usato lsof (elenchi i file aperti) e ho preso la sua output per trovare il process offensivo:

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