Ctrl+ Cnie zawsze działa w celu zabicia bieżącego procesu (na przykład, jeśli proces ten jest zajęty w niektórych operacjach sieciowych). W takim przypadku po prostu widzisz „^ C” za kursorem i nie możesz zrobić wiele więcej.
Jak najłatwiej zmusić ten proces do śmierci teraz bez utraty terminala?
Podsumowanie odpowiedzi:
Zazwyczaj możesz Ctrl+ Zuśpić proces, a następnie zrobić kill -9 _process-pid_
, gdy znajdziesz pid procesu za pomocą ps i innych narzędzi. W Bash (i ewentualnie innych powłokach) możesz zrobić kill -9 %1
(lub ogólnie „% N”), co jest łatwiejsze. Jeśli Ctrl+ Znie działa, będziesz musiał otworzyć inny terminal i zabić stamtąd.
screen
byłoby możliwym rozwiązaniem, umożliwiającym utworzenie nowego okna ikill
stamtąd proces.Odpowiedzi:
Aby zrozumieć problem, dlaczego Ctrl+ Cnie działa, bardzo pomocne jest zrozumienie, co się dzieje po naciśnięciu:
Większość powłok wiąże Ctrl+, Caby „wysłać sygnał SIGINT do programu, który obecnie działa na pierwszym planie”. Możesz przeczytać o różnych sygnałach za pomocą sygnału man :
Programy mogą zignorować ten sygnał, ponieważ mogą również zignorować SIGTSTP :
(To właśnie robi większość powłok po naciśnięciu Ctrl+ Z, dlatego nie gwarantuje się, że zadziała).
Istnieje kilka sygnałów, których proces nie może zignorować: SIGKILL , SIGSTOP i niektóre inne. Możesz wysłać te sygnały za pomocą polecenia kill . Tak więc, aby zabić swój proces zawieszenia / zombie, po prostu znajdź identyfikator procesu (PID). Na przykład użyj
pgrep
lub,ps
a następniekill
:źródło
Z
). W tym przypadku nie jest już w stanie obsłużyć sygnałów.)Jeśli Ctrl+ C(SIGINT) nie działa, spróbuj Ctrl+ \(SIGQUIT). Następnie spróbuj Ctrl+ Z(SIGTSTP). Jeśli to spowoduje powrót do monitu powłoki, zrób to
kill
na ID procesu. (Domyślnie jest to sygnał SIGTERM, który można określić zkill -TERM
. W niektórych muszli, może być w stanie wykorzystać%1
w odniesieniu do PID). Jeśli to nie zadziała, należy przejść do innej sesji terminala lub SSH i zrobieniakill
lubkill -TERM
na identyfikator procesu. Powinieneś to zrobić w ostatecznościkill -KILL
, aliaskill -9
, ponieważ nie daje to procesowi szansy na czyste przerwanie, zsynchronizowanie otwartych plików, usunięcie plików tymczasowych, zamknięcie połączeń sieciowych itp.źródło
Naciśnij Ctrl-Z, aby zawiesić program i umieścić go w tle :
(Przywróć ponownie na pierwszym planie za pomocą
fg
)Następnie można
kill
albokill -9
to, biorąc pod uwagę jego identyfikator procesu (to masz odps a
).źródło
kill $!
, podobnie jak$!
specjalna zmienna zawierająca pid ostatniego programu w tle.bg
raz, zanim zmienna otrzyma przypisaną wartość.bg
zaraz po Ctrl + Z tylko zawieszenia.ps
wyjścia (lubkillall
) jest dość ryzykowne, jeśli masz uruchomionych wiele procesów o tej samej nazwie.ps -e -o pid,command
dostarczy pid + pełne argumenty, nie tylko nazwę programu, ale znowu może nie wystarczyć do rozróżnienia. Natomiast$!
jest pewnym hitem.ps a
mojego systemu:27721 s000 T 0:00.09 top
Ile zawieszonych (T
jak sądzę) wystąpień tej samej komendy (top
) masz uruchomionych w tym samym tty (s000
)?Zobacz także ten link .
Ctrl+ Z: wstrzymaj proces.
Ctrl+ C: uprzejmie poproś o zamknięcie procesu teraz.
Ctrl+ \: bezlitośnie zabij proces, który jest obecnie na pierwszym planie
źródło
"ctrl"
+"\"
nie działało dla mnieZwykle nadal można zatrzymać proces ( Ctrl+ Z), a następnie użyć
kill -9
. Ponieważkill -9
potrzebujesz najpierw PID procesu . W przypadku zadań w tlekill -9 %1
jest to najłatwiejszy sposób - jeśli nie masz pewności, ile zadań w tle chcesz zabić, uruchomjobs
.Alternatywnie możesz znaleźć identyfikator procesu za pomocą
Potem możesz biec
źródło
Prostszym rozwiązaniem dla Bash (i innych powłok?) Jest:
gdzie „% 1” odnosi się do zabijanego zadania. Może to być „% 2” (lub coś innego), jeśli śpisz już w innej pracy. Możesz zobaczyć, jaki jest numer zadania po naciśnięciu Ctrl-z:
Zauważ, że „kill” to wersja kill powłoki, a nie / bin / kill.
źródło
1) Jeśli jesteś w konsoli i jest w trybie wielu użytkowników, możesz nacisnąć CTRL-ALT-Fn i zalogować się na innym ekranie, użyć
ps -ef | grep <myprocessname>
lub,pidof <myprocessname>
a następnie zabić -9 proces według numeru ID.2) Jeśli łączysz się zdalnie, zrób to samo za pośrednictwem innej sesji terminala.
Możesz także ułatwić sobie życie, instalując htop , który jest bardziej uniwersalną wersją topu, która pozwala selektywnie zabijać uruchomione procesy. Większość dystrybucji ma htop w repozytorium.
3) jeśli utknąłeś w zawieszonej sesji ssh (na przykład w innym systemie), spróbuj nacisnąć tyldę (~), która jest klawiszem Escape, a następnie naciśnij CTRL-Z, aby wrócić do sesji hosta, a następnie może zabić zablokowany proces ssh lub poczekać, aż upłynie limit czasu, co większość parapetów robi po okresie bezczynności.
źródło
Jeśli używasz tmux lub screena i żadne z powyższych nie działa, nadal możesz zabić okienko
<prefix> x
, wtedy proces również zostanie zabity.źródło
Być może w twoim / etc / profilu znajduje się zestaw pułapek z SIGINT (2). Jeśli tak, usuń go. Wyloguj się i zaloguj ponownie, a powinieneś być dobry.
źródło