Jak dowiedzieć się, który proces używa pliku w systemie Linux?

92

Próbowałem usunąć plik w systemie Linux za pomocą rm -rf file_name, ale otrzymałem błąd:

rm: file_name not removed.  Text file busy

Jak mogę się dowiedzieć, który proces używa tego pliku?

khris
źródło

Odpowiedzi:

137

Możesz użyć fuser polecenia, takiego jak:

fuser file_name

Otrzymasz listę procesów korzystających z pliku.

Możesz użyć z nim różnych flag, aby uzyskać bardziej szczegółowe wyniki.

Więcej informacji można znaleźć w artykule w Wikipedii dotyczącym utrwalacza lub na manstronach.

jimm-cl
źródło
Próbowałem tego: fuser -i / home / bin / lib. Ale mam to: utrwalacza: nielegalną opcję - i / home / bin / lib: 27674t
khris
1
@khris, może być tak, że nie wszystkie fuserimplementacje są takie same lub działają w ten sam sposób. Nawet jeśli -ijest zdefiniowana w POSIX, konkretna implementacja, której używasz, niekoniecznie ma te same opcje, co te opisane w artykule w Wikipedii. Na przykład używam teraz AIX, a fuserdostępne w tym systemie również nie mają takiej -iopcji.
jimm-cl
Z jakiegoś powodu ani fusernie lsofpracowali dla mnie na gościu virtualbox. Ta odpowiedź mnie uratowała.
kael
34

Odpowiedź @ jim jest poprawna - fusertego chcesz.

Dodatkowo (lub alternatywnie) możesz użyć, lsofaby uzyskać więcej informacji, w tym nazwę użytkownika, na wypadek, gdybyś potrzebował pozwolenia (bez konieczności uruchamiania dodatkowego polecenia), aby zabić proces. (Chociaż oczywiście, jeśli zabijanie procesu jest tym, czego chcesz, fusermożesz to zrobić za pomocą jego -kopcji. Możesz fuserużyć innych sygnałów z-s opcją - sprawdź stronę podręcznika po szczegóły.)

Na przykład z tail -F /etc/passwduruchomionym w jednym oknie:

ghoti@pc:~$ lsof | grep passwd
tail      12470    ghoti    3r      REG  251,0     2037 51515911 /etc/passwd

Zauważ, że możesz również użyć, lsofaby dowiedzieć się, jakie procesy używają określonych gniazd. Doskonałe narzędzie, które możesz mieć w swoim arsenale.

ghoti
źródło
które pole to PID?
nmz787
@ nmz787 - lsof | head -1aby zobaczyć wszystkie nagłówki.
ghoti
@ nmz787 Drugie pole to PID.
forthe
lsof | grep -E "PID|<your_process_name>"pokazuje zarówno pierwszy wiersz, jak i proces, o który chcesz zapytać.
Robin Hsu
0
$ lsof | tree MyFold

Jak pokazano na załączonym obrazku:

wprowadź opis obrazu tutaj

Blunt Notion
źródło
1
Jak to działa? Czy treeczyta cokolwiek ze stdin? Jeśli tak, co robi z tymi danymi wejściowymi?
dyp
man lsof - wyświetla instrukcję polecenia lsof, lsof - wyświetla listę otwartych plików, w swoim standardowym pliku wyjściowym wyświetla informacje o plikach otwieranych przez procesy i wynik w strukturze drzewa. powinieneś sprawdzić wyraźnie, co jest lsof
Blunt Notion
Moje pytanie dotyczy tree, nie lsof. O ile rozumiem, treenie czyta ze standardowego wejścia, dlatego wyjście lsofjest odrzucane po uruchomieniu lsof | tree .... Jeśli to prawda, to lsof | tree MyFoldjest to samo co tree MyFold, które wyświetla tylko zawartość, ale nie wyświetla plików otwieranych przez jakiś proces.
dyp