Dlaczego mój terminal zawiesza się?

11

Czasami, gdy mój terminal zawiesza się i nie pozwala mi pisać. Nie mogę zidentyfikować żadnych przyczyn ani sposobu diagnozowania. Jakieś sugestie?

Dzięki!

GNOME Terminal 2.30.2 na Ubuntu 10.04

David LeBauer
źródło
2
zwykle, gdy terminal zawiesza się, jest to spowodowane przez inną aplikację w tle używającą zbyt wielu zasobów, np. CPU lub Disk I / O. Jeśli uruchamiasz się topw terminalu, powinieneś być w stanie łatwo zlokalizować problem.
RolandiXor
@roland - brzmi jak catch-22, ale dobra rada, ponieważ czasami, gdy jeden terminal jest zamrożony, mogę otworzyć inny i zadziała.
David LeBauer,
Wiem, prawda? :) Jest to trochę chwytliwe 22, ale często działa dla mnie.
RolandiXor

Odpowiedzi:

14

Dobry ogólny sposób diagnozowania tajemniczych zawieszeń:

  1. otwórz terminal (inny) i użyj, ps axo pid,wchan:32,cmdaby znaleźć inny identyfikator procesu
  2. zwróć uwagę na wchankolumnę, która powinna ci powiedzieć, czy utknął w jądrze
  3. uruchom sudo strace -p PIDwstawiając pid tego procesu; wklej to do raportu o błędzie lub pytania

Jeśli jest coś oprócz kreski w kolumnie wchan, to proces polega na tym, że jądro coś robi. Niektóre typowe wartości:

  • futex_wait_queue_me - oczekiwanie na futexie na kolejny wątek w tym samym procesie
  • poll_schedule_timeout - czekanie na komunikację sieciową lub międzyprocesową lub po prostu spanie przez chwilę
  • pipe_wait - czytanie / pisanie fajki

Istnieją tysiące możliwości, więc nie mogę wymienić ich wszystkich. Zobacz, jaki jest „kanał oczekiwania” procesu? po więcej.

poolie
źródło
Bardzo przydatny do śledzenia błędów ogólnego przeznaczenia. Czy możesz zaktualizować swoją odpowiedź o obszerny opis? Jaki komunikat w wchan wskazuje, że program utknął w jądrze?
Salih Emin
Dzięki, Salih. Może powinniśmy mieć inne pytanie, jak ogólnie zdiagnozować problemy?
poolie
Jeśli ludzie są ciekawi innych wartości wchan, dodaj komentarz.
poolie
Wszelkie wchanoznacza proces czeka w jądrze. Jeśli pozostaje tam przez długi czas i nie ma żadnego dobrego powodu, aby słuchać sieci io, wtedy utknie. ;)
poolie
25

Czy nacisnąłeś kiedyś Ctrl + S? Jest to klawisz pauzy terminala, który zatrzymuje wszystkie dane wyjściowe, dopóki nie naciśniesz Ctrl-Q, aby wznowić.

Marius Gedminas
źródło