Jak poradzić sobie z „zajętym urządzeniem lub zasobem”?


229

Próbowałem rm -rfutworzyć folder i „zajęte było urządzenie lub zasób”.

W systemie Windows użyłbym LockHunter, aby rozwiązać ten problem. Jaki jest odpowiednik Linuksa? (Podaj jako odpowiedź prostą metodę „odblokuj ten” i nie uzupełniaj artykułów takich jak ten . Chociaż są one przydatne, obecnie interesuje mnie tylko ASimpleMethodThatWorks ™)


5
Dzięki temu przydało się - przychodziłem z Linuksa do Windowsa, szukałem odpowiednika lsof - LockHunter.
Sonia Hamilton,

3
Co do cholery? Uniks nie zapobiega usuwaniu otwartych plików, tak jak robi to system Windows. Dlatego możesz usunąć cały system, uruchamiając rm -rf /... szczęśliwie usunie każdy pojedynczy plik, w tym / bin / rm.
psusi

1
@psusi, to jest niepoprawne. Masz złe źródło informacji lub po prostu wymyślasz różne rzeczy. Linux, podobnie jak Windows, ma blokadę plików i urządzeń. Ale to trochę zepsute. 0pointer.de/blog/projects/locking.html
foobarbecue

1
@foobarbecue, zwykle są to tylko blokady doradcze, a strona podręcznika przynajmniej wydaje się wskazywać, że są one tylko do odczytu / zapisu, a nie rozłączania.
psusi

Odpowiedzi:


232

Narzędzie, które chcesz, to lsofskrót od plików otwartych na liście .

Ma wiele opcji, więc sprawdź stronę podręcznika, ale jeśli chcesz zobaczyć wszystkie otwarte pliki w katalogu:

lsof +D /path

To się powtórzy przez system plików poniżej /path, więc strzeż się robienia tego na dużych drzewach katalogów.

Gdy wiesz, które procesy mają otwarte pliki, możesz zamknąć te aplikacje lub zabić je za pomocą kill(1)polecenia.


46
Co jeśli nie byłoby wyników?
marines

22
@marines: Sprawdź, czy poniżej znajduje się inny system plików /path. To jedna z przyczyn ukrytych „otwartych plików”.
camh

2
Polecenie lsof bezpośrednio do ścieżki nie działa. Zasadniczo musisz przejść do lokalizacji ścieżki, a następnie uruchomić plik lsof busy_file, a następnie zabić cały proces
J4cK

4
lsofzdaje się nic dla mnie nie robić: lsof storage/logs/laravel.lognic nie zwróciło, i tak też zrobiłem lsof +D storage/logs/. umountodpowiedział z not mounted.
Ryan

1
Aby rozwinąć odpowiedź na @camh: Użyj mount | grep <path>. To pokazuje, /dev/<abc>że każdy może być zamontowany na <path>. Użyj, sudo umount -lf /dev/<abc>a następnie spróbuj usunąć <path>. Pracuje dla mnie. Dzięki @camh
Vikas Goel

107

czasami jest to wynikiem problemów z montażem, więc odmontowałem system plików lub katalog, który próbujesz usunąć:

umount / ścieżka


5
Za kwadrans czwarta. Dzięki stary, uratowałeś mi noc. Wesoły. Na jednej linii - tyle zmarnowanego czasu -.- '
Aiyion.Prime

1
moim problemem był katalog dziennika podłączony jako / dev / mapper / vg00-root
Spikolynn

1
Pomógł mi wydostać się z podobnego zacięcia na nawijarkach.
Jon

1
w moim przypadku Jenkins nie odmontował
katalogu

1
w moim przypadku odmontowano z działającym komputerem Ubuntu !! Dzięki
JRichardsz

14

Używam fuserdo tego rodzaju rzeczy. Spowoduje wyświetlenie, który proces korzysta z pliku lub plików w instalacji.


fuserpomaga tylko w konkretnym przypadku, gdy chcesz odmontować system plików. Problem polega na znalezieniu tego, co korzysta z określonego pliku.
Gilles

@Gilles: Działa również w przypadku plików.
BillThor

Przepraszamy, niewłaściwy sprzeciw: fusertutaj nie pomaga, ponieważ problemem jest znalezienie wszystkich otwartych plików w drzewie katalogów. Możesz kazać lsofpokazać wszystkie pliki i filtrować lub sprawić, by się powtarzały; fusernie ma takiego trybu i należy go wywoływać w każdym pliku.
Gilles

@Giles: fuserprace będą listy. Spróbuj fuser /var/log/*, jeśli jakieś dzienniki są otwarte, powie, które i kto ma otwarte. Jeśli zwykły symbol wieloznaczny nie będzie działał, findz lub bez xargs, wykona zadanie.
BillThor

1
lsofgdy nie był na mojej ścieżce fuser, co pozwoliło mi znaleźć ID procesu, który należy zabić, więc + 1 + dzięki.
stevesliva,

12

Oto rozwiązanie:

  1. Przejdź do katalogu i wpisz ls -a
  2. Znajdziesz .xyzplik
  3. vi .xyz i sprawdź, jaka jest zawartość pliku
  4. ps -ef | grep username
  5. Zobaczysz zawartość .xyz w 8. kolumnie (ostatni wiersz)
  6. kill -9 job_ids - gdzie job_ids jest wartością drugiej kolumny odpowiadającej treści spowodowanej błędem w 8 kolumnie
  7. Teraz spróbuj usunąć folder lub plik.

4
Interesujące byłoby wiedzieć, skąd pochodzą te tajemnicze pliki.
John WH Smith,

9

Miałem ten sam problem, zbudowałem jednowierszowy zaczynający się od rekomendacji @camh:

lsof +D ./ | awk '{print $2}' | tail -n +2 | xargs kill -9

awkKomenda chwyta PID. tailKomenda pozbywa się brzydkie pierwszego wpisu: „PID”. Użyłem -9przy zabiciu, inni mogą mieć bezpieczniejsze opcje.


1
Aby uczynić go bardziej uniwersalnym, możesz użyć ./ dla bieżącego katalogu zamiast log /
user2589273

Dobra uwaga, @ user2589273. Zaktualizowano
Choylton B. Higginbottom

5

Miałem ten problem, gdy automatyczny test utworzył ramdysk. Polecenia sugerowane w innych odpowiedzi, lsofi fuserbyły nie pomaga. Po testach próbowałem odmontować go, a następnie usunąć folder. Przez wieki byłem bardzo zdezorientowany, ponieważ nie mogłem się go pozbyć - ciągle byłem zajęty „urządzeniem lub zasobem” !

Przez przypadek dowiedziałem się, jak pozbyć się ramdysku. Musiałem odmontować to tyle razy, ile razy uruchomiłem mountpolecenie, tj sudo umount path

Ponieważ został stworzony przy użyciu testów automatycznych, był montowany wiele razy, dlatego nie mogłem się go pozbyć po prostu odmontowując go po testach. Więc po tym, jak ręcznie odmontowałem go wiele razy, w końcu znów stał się zwykłym folderem i mogłem go usunąć.

Mam nadzieję, że może to pomóc komuś, kto napotka ten problem!


5

Często zdarza mi się to na serwerach z sieciowymi systemami plików NFS. Zakładam, że ma to coś wspólnego z systemem plików, ponieważ pliki zwykle mają takie same nazwy .nfs000000123089abcxyz.

Moje typowe rozwiązanie polega na zmianie nazwy lub przeniesieniu katalogu nadrzędnego pliku, a następnie wrócę później za dzień lub dwa, a plik zostanie automatycznie usunięty, w którym to momencie mogę swobodnie usunąć katalog.

Zazwyczaj dzieje się tak w katalogach, w których instaluję lub kompiluję biblioteki oprogramowania.


4

Odrzucając powyższe pytanie Prabhata, miałem ten problem w macos high sierra, kiedy utknąłem proces enfs, restartowałem go, ale to rozwiązało, ale to

ps -ef | grep name-of-busy-dir

Pokazał mi proces i PID (kolumna druga).

sudo kill -15 pid-here

naprawione.


To też działało dla mnie. Co to -15jest
O.rka

3

Jeśli masz dostępny serwer, spróbuj

Usuwanie tego katalogu z serwera

Lub, wykonaj umount i podłącz ponownie, spróbuj umount -l: leniwy umount, jeśli napotkasz jakiekolwiek problemy na normalnym umount.

Ja też miałem ten problem gdzie

lsof +D path : nie daje wyniku

ps -ef : nie zawiera żadnych istotnych informacji

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.