it-swarm-eu.dev

Co dělat, když Ctrl-C nezabije běžící práci?

Procesy někdy ignorují signál SIGINT odeslaný Ctrl-C v Bash. Například man a vi. Za předpokladu, že nechcete google ani číst příručku o tom, jak ukončit běžící proces, existuje nějaká klíčová sekvence, která bude vždy fungovat (bez opuštění terminálu)?

103
Olivier Lalonde

Poslat [~ # ~] sigquit [~ # ~] signál s Ctrl+\.

.. $ sleep 10
^\Quit

→ To odpovídá kill -3 pid. Programy spuštěné v uživatelském prostoru neignorují sigquit.

K dispozici je také sada klávesových zkratek Magic SysRq . Jedním z nejzajímavějších je toto: Alt+SysRq+k. Zabíjí všechny procesy na aktuální virtuální konzoli. Pokud je některý z vašich tty zcela a naprosto zlomen, lze to použít k návratu . Na Xty, který běží na X.org, může být použit k zabití X bez milosti.

Klávesa SysRq je na většině klávesnic stejná jako klávesa Print. V mém notebooku je možné jej vyvolat pomocí klávesy Fn; Tj. Alt → Fn → Tisk → k v tomto pořadí.

Zde jsou některé základní zkratky pro správu procesů:

  • Ctrl+Z: pozastavení procesu (plus bg pro pokračování na pozadí, fg pro zvýšení do popředí)
  • Ctrl+C: zdvořile požádejte, aby byl proces nyní ukončen
  • Ctrl+\: nemilosrdně zabít proces, který je v současné době v popředí
  • Alt+SysRq+s: Zápis dat na disk (vždy to udělejte, než zabijete něco důležitého)
  • Alt+SysRq+sk: nemilosrdně zabije všechny aktuální procesy na dané virtuální konzoli
  • Alt+SysRq+sb: nemilosrdně restartovat bez odpojení,
  • Alt+SysRq+reisub: Bezpečně reboot even isystem je upřísně broken,

Poznámka: Ctrl+Z, na rozdíl od Ctrl+C a Ctrl+\, funguje také pro man, vi, less a podobně.

V případě pochybností bude postup follwing téměř vždy fungovat:

~$ 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 to samozřejmě naznačuje Ctrl+Z byl stisknut.


Podrobnější pohled na Shells and Terminals najdete také v mé odpovědi na:

150
Stefano Palazzo

Si můžete vyzkoušet Ctrl+\

16
Benjamin

Někdy CTRL+C se odesílá na nesprávný program nebo vstupní kanál. To je běžné zejména u editorů, jako je vi, u příkazů s výstupem piped, složitých bash příkazů zahrnujících smyčky atd.

Jednoduchým a rychlým řešením je pozastavení úlohy CTRL+Z a pak to zabijte číslem úlohy: kill %1 nebo kill -9 %1, atd.

8
tylerl
  • Vyzkoušejte jednu z těchto možností:

    Ctrl+4

    Ctrl+\


  • Nebo:

    Ctrl+Z a pak spustit:

    kill %1

Kde %1 je počet úloh, které byly vráceny po stisknutí Control-Z. Přidat -9 vynutit zabití.


Když jste v textové konzoli, můžete také vyzkoušet: Ctrl-SysRq. Jádro by mělo tento proces zabít.

Nebo SysRq-k, zabít všechny procesy na aktuální virtuální konzoli (může také zabíjet programy X a svgalib).

Poznámka: Pokud jsou k zabití zmrazeného grafického programu použity magické klávesy SysRq, nemá program šanci obnovit textový režim. Díky tomu může být vše nečitelné.

Viz: klíč Magic SysRq a jeho kombinace příkazů.

6
kenorb

Pro ukončení z man použijte q Chcete-li opustit vi použijte :q

3
antivirtel

Je možné, že jste zkratku kopie změnili z:

CTRL+SHIFT+C

Na

CTRL+C

Tímto způsobem, když se pokusíte zabít proces, CTRL+C nefunguje.

Zkuste nahradit zástupce kopie CTRL+SHIFT+C.

1
Minter