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)?

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:


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,


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.


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ń.



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.


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.


Zredagowałem pytanie, aby było jasne, że chcę zabić proces z poziomu terminala.
— Olivier Lalonde,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.