2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183
Advertisement

Co zrobić, gdy Ctrl + C nie może zabić procesu?

Advertisement

Ctrl + C nie zawsze działa, aby zabić bieżący proces (na przykład, jeśli proces ten jest zajęty w pewnych operacjach sieciowych). W takim przypadku widzisz po prostu “^C” przy kursorze i nie możesz zrobić wiele więcej.

Jaki jest najprostszy sposób, aby zmusić ten proces do śmierci teraz bez utraty terminala?

Summary odpowiedzi: Zazwyczaj możesz Ctrl + Z aby uśpić proces, a następnie zrobić kill -9 _process-pid_, gdzie znajdziesz pid procesu z ps i innymi narzędziami. Na Bash (i ewentualnie innych powłokach), możesz zrobić kill -9 %1 (lub ‘%N’ w ogóle) co jest łatwiejsze. Jeśli Ctrl + Z nie działa, będziesz musiał otworzyć inny terminal i kill z tego miejsca.

Advertisement
Advertisement

Odpowiedzi (9)

127
127
127
2011-02-09 09:13:54 +0000

Aby zrozumieć problem, dlaczego Ctrl + C nie działa, bardzo pomocne jest zrozumienie, co się dzieje po jego naciśnięciu:

Większość powłok wiąże Ctrl + C, aby “wysłać sygnał SIGINT do programu, który aktualnie działa na pierwszym planie”. O różnych sygnałach można przeczytać poprzez man signal :

SIGINT 2 Term Interrupt from keyboard

Programy mogą zignorować ten sygnał, ponieważ mogą zignorować również SIGTSTP :

SIGTSTP 18,20,24 Stop Stop typed at tty

(To, co robi większość powłok po naciśnięciu Ctrl + Z, dlatego nie ma gwarancji, że to zadziała)

Istnieją pewne sygnały, które nie mogą być zignorowane przez proces: SIGKILL , SIGSTOP i kilka innych. Sygnały te można wysyłać za pomocą polecenia kill . Tak więc, aby zabić proces wieszania / zombiey, po prostu znajdź ID procesu (PID). Na przykład, użyj pgrep lub ps a następnie kill to:

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

Jeśli Ctrl+C (SIGINT) nie działa, spróbuj Ctrl+\ (SIGQUIT). Następnie spróbuj Ctrl+Z (SIGTSTP). Jeśli zwraca to zachętę powłoki, wykonaj kill na ID procesu. (Domyślnie jest to sygnał SIGTERM, który można określić za pomocą kill -TERM. W niektórych powłokach, można użyć %1 do odwołania się do PID). Jeśli to nie działa, to należy przejść do innego terminala lub sesji SSH i wykonać kill lub kill -TERM na identyfikatorze procesu. Tylko jako ostateczność wykonaj kill -KILL, alias kill -9, ponieważ nie daje to procesowi możliwości czystego przerwania, zsynchronizowania otwartych plików, usunięcia plików tymczasowych, zamknięcia połączeń sieciowych, itp.

37
Advertisement
37
37
2012-06-19 03:03:03 +0000
Advertisement

Zobacz również ten link .

Ctrl+Z: zatrzymaj proces.

Ctrl+C: uprzejmie poproś o zamknięcie procesu teraz.

Ctrl+: bezlitośnie zabij proces, który jest obecnie na pierwszym planie

33
33
33
2011-02-09 08:53:17 +0000

Naciśnij Ctrl-Z, aby zawiesić program i umieścić go w tle :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Przywróć na pierwszy plan ponownie używając fg)

Następnie, możesz kill lub kill -9 to, podając jego ID procesu (otrzymujesz to z ps a).

13
Advertisement
13
13
2011-02-09 08:53:41 +0000
Advertisement

Zazwyczaj można jeszcze zatrzymać proces (Ctrl + Z), a następnie użyć kill -9. W przypadku kill -9, najpierw należy użyć proces PID . Dla zadań w tle, kill -9 %1 jest najprostszym sposobem - jeśli nie jesteś pewien, ile zadań w tle chcesz zabić, uruchom jobs.

Alternatywnie, możesz znaleźć ID procesu z

ps

Następnie możesz uruchomić

kill -9 <Appropriate PID from ps output>
5
5
5
2011-02-09 22:40:53 +0000

Prostszym rozwiązaniem dla Basha (i innych pocisków?) jest wykonanie:

Ctrl-z followed by kill -9 %1

gdzie “%1” odnosi się do zabijanego numeru zadania. Może to być “%2” (lub coś innego), jeśli masz już uśpione inne zadania. Możesz zobaczyć, który numer zadania to jest, gdy trafisz Ctrl-z:

[1]+ Stopped <process name>

Zauważ, że ‘kill’ jest wersją kill powłoki, a nie /bin/kill.

4
Advertisement
4
4
2011-02-09 09:01:45 +0000
Advertisement

1) Jeśli jesteś na konsoli i w trybie wieloużytkownikowym, 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 po numerze ID.

2) Jeśli jesteś podłączony zdalnie, zrób to samo przez inną sesję terminalową.

Możesz też trochę ułatwić sobie życie instalując htop , który jest bardziej wszechstronną wersją topu, która pozwala selektywnie zabijać uruchomione procesy. Większość distros ma htop w repo.

3) jeśli po prostu utknąłeś w zawieszonej sesji ssh (na przykład do innego systemu), spróbuj nacisnąć tyldę (~), która jest kluczem ucieczki, a następnie naciśnij CTRL-Z, aby wrócić do sesji hosta, następnie możesz zabić utknięty proces ssh lub poczekać na timeout, co większość sill robi po okresie braku aktywności.

0
0
0
2017-04-18 10:41:06 +0000

Jeśli używasz tmuksu lub ekranu, a żaden z powyższych nie działa, możesz zabić szybę do <prefix> x, wtedy proces również zostanie zabity.

0
Advertisement
0
0
2017-10-26 13:16:30 +0000
Advertisement

Tam może być pułapka z SIGINT(2) w twoim /etc/profile. Jeśli tak, to go zdejmij. Wyloguj się i zaloguj z powrotem. Powinieneś być dobry.

Advertisement

Pytania pokrewne

6
10
11
5
6
Advertisement
Advertisement