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

Jak mogę określić jaki proces ma otwarty plik w Linuksie?

Chciałbym określić jaki proces ma własność pliku z blokadą. Pliki z blokadami to po prostu plik o określonej nazwie, który został utworzony.

Jak mogę określić, który proces ma otwarty konkretny plik w Linuksie? Preferowany jest typ jednolinijkowy lub konkretne rozwiązanie narzędziowe dla Linuksa.

Odpowiedzi (4)

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

Na większości systemów Linux lsof NAME wykonuje swoją pracę:

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

Możesz również użyć fuser do tego:

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

Posiadanie otwartego pliku nie jest kłódką, ponieważ jeśli każdy proces musi najpierw sprawdzić, czy plik jest otwarty, a nie kontynuować, jeśli jest, lub stworzyć/otworzyć go, jeśli nie jest, to dwa procesy mogą sprawdzić jednocześnie, oba stwierdzą, że nie jest otwarty, a następnie oba stworzą lub otworzą go.

Aby użyć pliku jako kłódki, operacja “check-and-lock” musi być pojedynczą nieprzerywaną operacją. Można to osiągnąć w uniksowym systemie plików, tworząc plik w trybie tylko do odczytu i usuwając go w celu odblokowania. Jeżeli plik istnieje (i jest tylko do odczytu), to jego utworzenie nie powiedzie się, więc w pojedynczej operacji atomowej otrzymujemy operację “check-and-lock”.

Jeśli Twój proces blokowania jest skryptem powłoki, który będzie działał jako demon, możesz uzyskać ten efekt używając umask, ustawienia dla każdego procesu, które ustawia uprawnienia, za pomocą których tworzone są nowe pliki:

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

To także zapisuje do pliku PID własnego procesu, co rozwiązuje Twój inny problem: cat /var/lock/foo * * W odniesieniu do konkretnego pytania “Które procesy mają ten plik otwarty? ”, może to być użyteczne, gdy chcesz odmontować system plików, ale nie możesz, ponieważ jakiś proces ma w nim otwarty plik. Jeśli nie masz tych poleceń, możesz zapytać /proc jako root:

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

lub, jako śmiertelny użytkownik:

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

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

Stwierdziłem, że korzystając z zaakceptowanej odpowiedzi nie wymieniłem procesów, które używają mojego katalogu ( ubuntu 14.04 ).

Na koniec, użyłem lsof (lista otwartych plików) i wziąłem jego wyjście, aby znaleźć proces przestępczy:

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