Chciałbym ustalić, który proces ma własność pliku blokady. Pliki blokady to po prostu plik o określonej nazwie, który został utworzony.
Jak więc ustalić, który proces ma otwarty konkretny plik w systemie Linux? Najlepszym rozwiązaniem byłby typ z jedną linią lub konkretne narzędzie dla systemu Linux.
if [
fuser „$ file” ']; następnie exit`ls
następuje - zwraca kod wyjścia 2, jeśli wystąpi błąd (np. Podano niepoprawną opcję) lub plik nie został znaleziony (i 0, jeśli pomyślnie zgłosi informacje).W większości systemów Linux
lsof NAME
działa:źródło
cwd
wiersze (które zgłaszają użycie jako bieżący katalog roboczy procesu) zgłaszają tylko katalogi.Otwarcie pliku nie jest blokadą, ponieważ jeśli każdy proces musi najpierw sprawdzić, czy plik jest otwarty i nie kontynuować, jeśli jest, lub utworzyć / otworzyć, jeśli nie jest, wówczas dwa procesy mogą całkiem dobrze sprawdzić jednocześnie, oba że nie jest otwarty, a następnie obaj go utwórz lub otwórz.
Aby użyć pliku jako blokady, operacja sprawdzania i blokowania musi być pojedynczą operacją nieprzerwaną. Możesz to osiągnąć w systemie plików Unix, tworząc plik w trybie tylko do odczytu i usuwając go, aby odblokować. Jeśli plik istnieje (i jest tylko do odczytu), tworzenie pliku zakończy się niepowodzeniem, więc otrzymujesz sprawdzenie i zablokowanie w pojedynczej operacji atomowej.
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
Spowoduje to również zapisanie PID procesu właściciela w pliku, co rozwiązuje inny problem:umask
ustawienia na proces, które określa uprawnienia, z którymi tworzone są nowe pliki:cat /var/lock/foo
Jeśli chodzi o konkretne pytanie „Które procesy mają ten plik otwarty?”, Może to być przydatne, gdy chcesz odmontować system plików, ale nie może, ponieważ w niektórych procesach jest otwarty plik. Jeśli nie masz dostępnych 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$'
źródło
Jeśli chcesz wiedzieć, który deskryptor pliku procesu prowadzi do twojego pliku bez
lsof
lubfuser
- szukaj przez/proc
:Zastąp
$1
otwartą nazwą pliku, którego szukasz. Można dokonać zmian-printf
, o cokolwiek chcecie, aby zobaczyć, czy rury doegrep -o '[0-9]+' | head -1
do stosowania dla tego procesu jest informacją.ps -Fp <pid>
Odpowiedź przez @fin jest najlepszą odpowiedź, oczywiście, ale odpowiedzieć @ komentarzu JoseLSegura użytkownika , jeśli nie jest to możliwe, nad rozwiązaniem była moja odpowiedź.
$ lsof <filename>
źródło
Stwierdziłem, że użycie zaakceptowanej odpowiedzi nie wymieniało procesów korzystających z mojego katalogu (ubuntu 14.04).
Na koniec użyłem lsof (lista otwartych plików) i grep wypisałem jego dane wyjściowe, aby znaleźć proces obrażający:
źródło
lsof
jest jego opcja-R
. np .:lsof -R [filename]