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

Hoe kan ik bepalen welk proces een bestand open heeft in Linux?

Ik wil graag bepalen welk proces eigenaar is van een lock-file. De lock-files zijn simpelweg een bestand met een specifieke naam dat is aangemaakt.

Hoe kan ik dus bepalen welk proces een bepaald bestand open heeft in Linux? Bij voorkeur zou een one-liner type of een bepaalde Linux tool oplossing optimaal zijn.

Antwoorden (4)

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

Op de meeste Linux systemen doet lsof NAME het werk:

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

U kunt hiervoor ook fuser gebruiken:

~> 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

Het open hebben van een bestand is geen “lock” omdat, als elk proces eerst moet controleren of het bestand open is en niet verder moet gaan als het open is of het aanmaken/openen als het dat niet is, dan kunnen twee processen tegelijk controleren, beide vinden dat het niet open is, dan beide aanmaken of openen.

Om een bestand als “lock” te gebruiken, moet de “check-and-lock” operatie een enkele ononderbroken operatie zijn. U kunt dit bereiken in een Unix bestandssysteem door een bestand met alleen-lezen modus aan te maken en het te verwijderen om te ontgrendelen. Als het bestand bestaat (en alleen-lezen is) zal de bestandsaanmaak mislukken, dus u krijgt check-and-lock in een enkele atomaire operatie.

Als uw locking proces een shell script is dat als een daemon zal draaien, kunt u dit effect krijgen door umask te gebruiken, een per-proces instelling die de permissies zet dat nieuwe bestanden worden aangemaakt met:

oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask

Dit schrijft ook het eigen proces’ PID in het bestand, wat uw andere probleem oplost: cat /var/lock/foo * * Met betrekking tot de specifieke vraag “Welke processen hebben dit bestand openstaan? ”, kan dit nuttig zijn wanneer u een bestandssysteem wilt unmounten, maar kan dit niet omdat een of ander proces een bestand open heeft staan. Als je die commando’s niet beschikbaar hebt, kun je /proc vragen als root:

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

of, als sterfelijke gebruiker:

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

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

Ik vond dat het gebruik van het geaccepteerde antwoord niet de processen vermeldde die mijn directory gebruikten ( ubuntu 14.04 ).

Uiteindelijk gebruikte ik lsof (lijst open bestanden) en begroette de uitvoer ervan om het beledigende proces te vinden:

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