Jak przerwać zablokowane polecenie na serwerze Ubuntu?

11

Wiem, że jest ctrl+ c, ale czasami to nie działa. Na pulpicie Ubuntu mogę po prostu zamknąć okno terminala i otworzyć nowe, gdy tak się stanie, ale jak można to rozwiązać za pomocą interfejsu CLI na serwerze Ubuntu (bez ponownego uruchamiania pudełka)?

Zwariowany
źródło

Odpowiedzi:

21

CTRL+Cwyśle SIGINTdo aplikacji. Aplikacja może skonfigurować moduł obsługi tego sygnału lub zignorować sygnał. Domyślnie nie ma SIGINTmodułu obsługi i zabija aplikację.

Możesz użyć, CTRL+\który wyśle SIGQUIT. Spowoduje to również wygenerowanie zrzutu rdzenia, jeśli limit rdzenia nie będzie wynosił zero.

Możesz zawiesić proces i powrócić do powłoki za pomocą CTRL+Z, to zatrzyma wykonanie procesu i powróci do monitu powłoki. Proces będzie w pamięci i będzie dostępny jako zadanie w bieżącej powłoce. Następnie możesz użyć kill -SIGNAL %%lub, kill -SIGNAL %<job_ID>aby wysłać sygnał do tego zadania. Np. Zabić ostatniego użycia pracykill -9 %%

Jeśli żaden z nich nie działa, zawsze możesz wysłać SIGTERM, w ostateczności, SIGKILLco zakończy każdy proces. Sygnał ten, podobnie jak wszelkie inne sygnały, musi być wysyłany jako ten sam użytkownik co proces, który próbujesz zatrzymać lub jako root. Aby wysłać SIGKILLdo procesu, najpierw znaleźć proces ps auxlub ps -edf, a następnie uruchomić kill -SIGKILL <process_ID>, gdzie <process_ID>jest PIDkolumna w pswyjściu.

Sygnałów nie można dostarczyć, jeśli proces odbywa się w trybie nieprzerwanego połączenia. Wywołania nieprzerwane to funkcje jądra, których nie można zatrzymać i zwykle występują z powodu złego sterownika (np. Sterownika, który nie jest ponownie wysyłany ). Procesu, który jest w nieprzerwanym trybie uśpienia, nie można zatrzymać, dopóki połączenie nie zostanie zakończone lub serwer nie zostanie ponownie uruchomiony.

Jeśli proces stanie się zombie , nie zużyje żadnych zasobów, zajmując tylko miejsce w tabeli procesów. Proces zombie nie może odbierać sygnałów.

Listę sygnałów dla bieżącej architektury można znaleźć za pomocą kill -l

Zobacz strony człowiekiem kill, psi bash. Aby zobaczyć stronę podręcznika, użyj czegoś takiego:man ps

Mircea Vutcovici
źródło
2

Jeśli masz pełny dostęp do konsoli, możesz to zrobić Alt- F1..12i uzyskać nową konsolę.

Stamtąd możesz wykonać następującą listę procesów:

ps aux | grep <process-name>

Następnie wykonaj killidentyfikator procesu:

kill -9 <pid>

Jeśli nie masz pełnego dostępu do konsoli, po prostu otwórz inne okno terminala (być może za pośrednictwem PuTTY lub podobnego) i wykonaj powyższe kroki procesu i zabij.

królikarnia
źródło
1

Ctrl C wysyła SIGINT do uruchomionego procesu. Jeśli nie chcesz otwierać innej konsoli, możesz wysłać SIGQUIT za pomocą Ctrl \. Dotyczy to większości codziennych aplikacji, w których SIGINT nie.

Osobiście szukałem sposobu wysłania SIGKILL za pomocą skrótu, ale nie wiem, jak to zrobić.

Tim Brigham
źródło
1

Uważam pgrepi jestem pkillłatwiejszy w użyciu niż killz wyraźnym identyfikatorem procesu.

Ponadto zamiast zaczynać od sygnału 9 (SIGKILL), rozważ rozpoczęcie od domyślnego SIGTERM (15). To da szansę procesowi z wdziękiem zakończyć (jeśli to możliwe). pkill -15 thingi pkill thingpowinien być równoważny.

Oto jak to by działało. Powiedzmy, że ntpd jest zawieszony.

Jakie są procesy? (Możesz przejść do pkill, jeśli uważasz, że nie będziesz mieć fałszywych trafień).

$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd

Zabij procesy:

$ pkill ntpd

Użyj pgrepponownie, aby sprawdzić, czy się udało.

Jeśli nie, w końcu przejdź do pkill -9.

Belacqua
źródło
0

Przełączasz się na nowy terminal, znajdź PID zablokowanego procesu (za pomocą ps), a następnie użyj, killaby zabić proces. Chciałbym najpierw użyć kill (PID). Jeśli to nie zadziała, skorzystałbym kill -9 (PID). Jeśli to nie zatrzyma procesu, należy ponownie uruchomić komputer.

Bill Weiss
źródło
0

Cntrl+ \pracował dla mnie (gdzie Cntrl+ club znie działał)

Vineeshvs
źródło