Co zrobić, gdy Ctrl-C nie zabije uruchomionego zadania?

98

Czasami procesy ignorują sygnał SIGINT wysyłany przez Ctrl- Cw Bash. Na przykład mani vi. Zakładając, że nie chcesz wyszukiwać w Google ani nie przeczytać instrukcji, jak wyjść z uruchomionego procesu, czy istnieje jakaś sekwencja klawiszy, która zawsze będzie działać (bez opuszczania terminala)?

Olivier Lalonde
źródło

Odpowiedzi:

141

Wyślij sygnał SIGQUIT za pomocą Ctrl+ \.

.. $ sleep 10
^\Quit

→ Jest to równoważne z kill -3 pid. Programy działające w przestrzeni użytkownika nie ignorują sigquit.

Istnieje również zestaw skrótów klawiaturowych Magic SysRq . Jednym z bardziej interesujących jest: Alt+ SysRq+ k. Zabija każdy proces na bieżącej konsoli wirtualnej. Jeśli jeden z twoich ttys jest całkowicie i całkowicie zepsuty, można go użyć do powrotu . Na tty działającym X.org można go użyć do zabicia X bez litości.

Klawisz SysRq jest w większości klawiatur taki sam jak Klawisz drukowania. Na moim notebooku można go wywołać za pomocą klawisza Fn; Tj. Alt → Fn → Drukuj → kw tej kolejności.

Oto niektóre podstawowe skróty do zarządzania procesami:

  • Ctrl+ Z: wstrzymaj proces (plus, bgaby wznowić w tle, fgaby przejść na pierwszy plan)
  • Ctrl+ C: uprzejmie poproś o zamknięcie procesu teraz
  • Ctrl+ \: bezlitośnie zabij proces, który jest obecnie na pierwszym planie
  • Alt+ SysRq+ s: Zapisz dane na dysk (zawsze rób to przed zabiciem czegoś ważnego)
  • Alt+ SysRq+ s, k: Bezlitośnie zabić wszystkie obecne procesy na danej konsoli wirtualnej
  • Alt+ SysRq+ s, b: Niemiłosiernie restart bez odmontowuję,
  • Alt+ SysRq+ r, e, i, s, u, b: Bezpiecznie r eboot e ven i f s ystem jest u tterly b Roken,

Uwaga: Ctrl+ Z, w przeciwieństwie do Ctrl+ Ci Ctrl+ \, działa również na man, vi, less, i tym podobne.

W razie wątpliwości procedura podążania będzie prawie zawsze działać:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z oczywiście oznacza, że Ctrl+ Zzostał naciśnięty.


Aby uzyskać bardziej dogłębne spojrzenie na muszle i terminale, zobacz także moje odpowiedzi na:

Stefano Palazzo
źródło
3
Działa dla „spać 10”, ale nadal nie działa dla „człowieka” lub „vi”. Oczywiście „kill -9 pid” działa przy zabijaniu obu procesów. Czy coś brakuje?
Olivier Lalonde,
3
Ctrl + Z działa z takimi rzeczami, jak less, man, vi itd. Następnie można zabić je robi ps, aby zobaczyć swój identyfikator procesu i zabić je za pomocą kill pidlub, jeśli nie dbają o innych instancji programu killall vi. W każdym razie Ctrl-Z zawsze wydaje się działać.
Stefano Palazzo
5
Możesz także zrobić, kill %%aby zabić ostatnią pracę, a kill %5gdzie 5 to numer pracy pokazany w jobs.
Olivier Lalonde
2
Ctrl- \ wysyła SIGQUIT , a nie SIGKILL. Istnieje kilka ważnych różnic między SIGQUIT a SIGKILL. en.wikipedia.org/wiki/SIGQUIT
Juliano
4
Jak nacisnąć Ctrl+, \ gdy \ w układzie klawiatury nie ma żadnego klawisza?
Forivin,
14

Możesz spróbować Ctrl+\

Benzoes
źródło
1
Nie działa z żadnym z manlub vi.
Hippo
1
pracował ubuntu 16.04
kRazzy R 13.02.18
8

Czasami CTRL+Cjest wysyłany do niewłaściwego programu lub kanału wejściowego. Jest to szczególnie powszechne w przypadku edytorów, takich jak vi, w przypadku poleceń z wyjściem potokowym, złożone polecenia bash obejmujące pętle itp.

Prostym i szybkim rozwiązaniem jest zawieszenie zadania, CTRL+Za następnie zabicie go według numeru zadania: kill %1lub kill -9 %1itp.

tylerl
źródło
6
  • Spróbuj jednego z tych:

    Ctrl+4

    Ctrl+\


  • Lub:

    Ctrl+ Za następnie uruchom:

    kill %1

Gdzie %1jest liczba zadań, które zostały zwrócone po naciśnięciu Control- Z. Dodaj, -9aby wymusić zabicie.


Gdy korzystasz z konsoli tekstowej, możesz także spróbować: Ctrl- SysRq. Jądro powinno zabić proces.

Lub SysRq- kzabij wszystkie procesy na bieżącej konsoli wirtualnej (możesz również zabić programy X i svgalib).

Uwaga: Kiedy magiczne klucze SysRq są używane do zabicia zamrożonego programu graficznego, program nie ma szans na przywrócenie trybu tekstowego. To może sprawić, że wszystko będzie nieczytelne.

Zobacz: Klawisz Magic SysRq i jego kombinacje poleceń.

kenorb
źródło
3

Aby wyjść z człowieka , użyj q Aby wyjść vi użyj:q

antivirtel
źródło
0

Możliwe, że zmieniłeś skrót kopii z:

CTRL+ SHIFT+C

Do

CTRL+C

W ten sposób, gdy próbujesz zabić proces, CTRL+ Cnie działa.

Spróbuj zamienić skrót kopiowania na CTRL+ SHIFT+ C.

Minter
źródło
1
Zmiana skrótu kopiowania nie ma znaczenia, aby wymusić zakończenie procesu!
SuB
Czy możesz trochę rozszerzyć swoją odpowiedź? Krok po kroku byłby idealny, przede wszystkim po to, aby PO mógł podążać za twoją sugestią. :)
ThatGuy,
To mi naprawdę pomogło. Jestem przyzwyczajony do CTRL + C na MacOS i nie zdawałem sobie sprawy, że polecenie Ubuntu to CTRL + SHIFT + C
ratskin
-1

Spróbuj Ctrl+ Alt+Backspace

Jeśli używasz Ubuntu 10.04, chcesz włączyć ten klucz, aby działał.

Aby włączyć Control- Alt-Backspace

Idź do Systemu -> Preferencje -> Klawiatura

Wybierz kartę Układy i kliknij Opcje układu .

Wybierz Sekwencję klawiszy, aby zabić serwer X i włączyć Control+ Alt+Backspace .

Uwaga:

Naciśnięcie Ctrl- Alt- Backspacezrestartuje twój serwer X.

karthick87
źródło
Zredagowałem pytanie, aby było jasne, że chcę zabić proces z poziomu terminala.
Olivier Lalonde,