GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu stisknout Ctrl-Z a bg jedním stisknutím klávesy, aby proces pokračoval na pozadí?

Klávesa Ctrl +Z sekvence je zpracovávána terminálem, nikoli shellem. (Užitečné pozadí:Jaký je přesný rozdíl mezi 'terminálem', 'shell', 'tty' a 'konzolí'?)

Pouze malá, nerozšiřitelná sada funkcí může být svázána s klávesou v terminálu. Klávesy svázané s těmito funkcemi můžete přizpůsobit, ale nepřidávat další funkce. Tyto funkce spadají do tří kategorií:

  • Edice příkazového řádku v programech, které neposkytují svůj vlastní (kanonický režim, také nazývaný předvařený režim (na základě opozice s režimem raw), který v praxi využijete jen zřídka):konec souboru (eof , Ctrl +D ), konec řádku (eol , Ctrl +M ), vymažte zbývající znak (erase , Ctrl +H ), vymažte slovo vlevo (werase , Ctrl +W ), vymazat řádek (kill , Ctrl +U ).
  • Ruční řízení toku:stop (Ctrl +S ), start (Ctrl +Q ). Užitečné pouze na starých sériových terminálech, které vynechávaly znaky, když terminál nemohl držet krok s počítačem nebo naopak.
  • Signalizace:přerušení (intr , Ctrl +C ), vynutit ukončení (quit , Ctrl +\ ), pozastavit (Ctrl +Z ).

Některé systémy, včetně Linuxu, tento seznam rozšiřují, ale nikdy jsem neviděl žádný, který by zahrnoval pozadí. Všimněte si, že by to vyžadovalo podporu jak v ovladači terminálu v jádře, tak v emulátoru terminálu. Musíte si tedy vystačit s uspáním, které vyšle úloze na popředí signál SIGTSTP. To spustí SIGCHLD v nadřazeném procesu vedoucího úlohy v popředí, což je obvykle shell. Když shell přijme SIGCHLD, zavolá waitpid aby zjistil, proč byl upozorněn, a když zjistí, že úloha na pozadí byla pozastavena, zobrazí upozornění (např. [1] + 12345 suspended mycommand ) a novou výzvu.

Shell můžete naprogramovat tak, aby posílal SIGCONT signál pro úlohu v popředí. Nemyslím si, že na to zsh má háček, bylo by potřeba opravit zdrojový kód. A zsh nemá žádný způsob, jak zjistit, zda jste skutečně chtěli program přerušit (jejda, tento program možná dělá špatnou věc, dovolte mi ho pozastavit, než to vyřeším) nebo jej přerušit.

Co udělám, je nastavit Ctrl +Z sekvence kláves v zsh na pozadí aktuální úlohy (%% ). Tímto způsobem mohu odeslat úlohu v popředí na pozadí stisknutím Ctrl +Z Ctrl +Z . Když už jsem u toho, udělám Ctrl +Z udělejte něco jiného užitečného, ​​když aktuální vstupní řádek není prázdný (takže jsem se právě nevrátil z podprocesu):„pozastavit“ aktuální vstupní řádek, což mi umožní zadat další příkaz, po kterém se přerušený řádek vrátí zpět do vstupní vyrovnávací paměť.

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

^z ^z jako zsh výše je možné v bash, i když je to trochu nemotorné a dlouho jsem to nespustil:

  • Do souboru .inputrc zahrňte mapování "\C-z": "bg\n"
  • Do proměnné bash PS0 zahrňte `$(stty susp ^z)'
  • Do proměnné bash PROMPT_COMMAND zahrňte 'stty susp ^@'

takže ^z pro pozastavení je zapnuto, když je spuštěn příkaz, a poté vypnuto pro bash prompt.


Linux
  1. Jak spustit proces Rsync na pozadí

  2. Jak může proces zachytit stdout a stderr jiného procesu v Linuxu?

  3. Jak získat ID procesu na pozadí?

  1. Proces na pozadí v linuxu

  2. Jak mohu udělat sudo session hodinu a ne pár minut v Ubuntu 10.04?

  3. Co dělat, když Ctrl + C nemůže zabít proces?

  1. Jak pozastavit a přenést proces na pozadí do popředí?

  2. Mohu omezit uživatele (a jejich aplikace) na jedno síťové rozhraní?

  3. Jak obnovit všechna vlákna (a děti) jednoho procesu v Linuxu?