- Dave McKay
@TheGurkha
- 24. září 2019, v 8:00 EDT
Pomocí Bash shell v Linuxu spravovat popředí a pozadí procesů. Můžete použít funkce a signály řízení úlohy Bash, které vám poskytnou větší flexibilitu v tom, jak spouštíte příkazy. Ukážeme vám jak.
vše o procesech
kdykoli je program spuštěn v operačním systému Linux nebo Unix, spustí se proces., „Proces“ je název pro interní reprezentaci vykonávajícího programu v paměti počítače. Existuje Proces pro každý aktivní program. Ve skutečnosti existuje proces téměř všeho, co běží na vašem počítači. To zahrnuje komponenty vašeho grafického desktopového prostředí (GDE), jako je GNOME nebo KDE, a systémové démony, které jsou spuštěny při spuštění.
proč téměř vše, co běží? Vestavěné Bash, jako jsou cd, pwd a alias, nemusí mít při spuštění spuštěn proces (nebo „plodil“)., Bash provádí tyto příkazy v instanci shellu Bash, který běží v okně terminálu. Tyto příkazy jsou rychlé právě proto, že pro jejich provedení nemusí být spuštěn proces. (V okně terminálu můžete zadat help
a zobrazit seznam vestavěných Bash.)
procesy mohou být spuštěny v popředí, v takovém případě převezmou váš terminál, dokud nebudou dokončeny, nebo je lze spustit na pozadí., Procesy, které běží na pozadí, dominují v okně terminálu a můžete v něm pokračovat. Nebo alespoň dominují v okně terminálu, pokud negenerují výstup obrazovky.
chaotický příklad
spustíme jednoduchýping
trace running. Chystáme se ping
doména How-To Geek. To se provede jako proces popředí.
ping www.howtogeek.com
dostaneme očekávané výsledky a posouváme se dolů po okně terminálu. Nemůžeme dělat nic jiného v okně terminálu, zatímcoping
běží., Chcete-li ukončit příkaz hit Ctrl+C
.
Ctrl+C
viditelný efekt Ctrl+C
je zvýrazněn na snímku obrazovky. ping
dává krátké shrnutí a pak se zastaví.
zopakujme to. Ale tentokrát budeme hit Ctrl+Z
namísto Ctrl+C
. Úkol nebude ukončen. Stane se úkolem na pozadí. Dostaneme kontrolu nad oknem terminálu, které se nám vrátilo.,
ping www.howtogeek.com
Ctrl+Z
viditelný efekt zasažení Ctrl+Z
je zvýrazněn na snímku obrazovky.
tentokrát nám bylo řečeno, že proces je zastaven. Zastavení neznamená ukončení. Je to jako auto na stopce. Nezrušili jsme ho a vyhodili. Je to stále na cestě, stacionární, čeká jít. Tento proces je nyní úkolem na pozadí.
příkazjobs
zobrazí seznam úloh, které byly spuštěny v aktuální relaci terminálu., A protože úlohy jsou (nevyhnutelně) procesy, můžeme také použít příkaz ps
, abychom je viděli. Použijeme oba příkazy a porovnáme jejich výstupy. Použijeme volbu T
(terminál), abychom uvedli pouze procesy spuštěné v tomto okně terminálu. Všimněte si, že není třeba používat spojovník -
s volbou T
.
jobs
ps T
jobs
příkaz nám říká:
- : číslo v hranatých závorkách je číslo úlohy., Můžeme to použít k označení úlohy, když ji potřebujeme ovládat pomocí příkazů pro řízení úlohy.
- +: znaménko plus
+
ukazuje, že se jedná o úlohu, na kterou se bude jednat, pokud použijeme příkaz řízení úlohy bez konkrétního čísla úlohy. Nazývá se výchozí úloha. Výchozí úloha je vždy ta, která byla naposledy přidána do seznamu úloh. - zastaveno: proces není spuštěn.
- ping www.howtogeek.com: příkazový řádek, který zahájil proces.,
příkazps
nám říká:
- PID: ID procesu procesu. Každý proces má jedinečné ID.
- TTY: pseudo-teletype (terminálové okno), ze kterého byl proces proveden.
- STAT: stav procesu.
- čas: množství času CPU spotřebovaného procesem.příkaz
- : příkaz, který proces spustil.
jedná se o běžné hodnoty pro sloupec STAT:
- D: Nepřerušitelný spánek. Proces je v čekacím stavu, obvykle čeká na vstup nebo výstup a nemůže být přerušen.,
- i: Idle.
- R: Běh.
- s: Přerušitelný spánek.
- T: zastaveno kontrolním signálem úlohy.
- z: zombie proces. Proces byl ukončen, ale nebyl“ vyčištěn “ mateřským procesem.
hodnota do STAT sloupec může být následován jedním z těchto dalších ukazatelů:
- <: High-prioritní úkol (není hezké na další procesy).
- N: Low-priority (nice to other processes).
- L: proces má stránky uzamčené do paměti (obvykle používané procesy v reálném čase).,
- s: vůdce relace. Vedoucí relace je proces, který spustil procesní skupiny. Shell je vůdce relace.
- l: vícevláknový proces.
- +: proces popředí.
vidíme, že Bash má stav Ss
. Velká písmena“ S “ nám říkají, že skořápka Bash spí a je přerušitelná. Jakmile to budeme potřebovat, bude reagovat. Malá písmena“ s “ nám říkají, že shell je vůdce relace.
příkaz ping má stav T
., To nám říká, že ping
byl zastaven kontrolním signálem úlohy. V tomto příkladu to byl Ctrl+Z
, který jsme použili k jeho vložení do pozadí.
příkazps T
má stav R
, což znamená Běh. +
znamená, že tento proces je členem skupiny popředí. Takže v popředí běží příkaz ps T
.
příkaz bg
příkazbg
se používá k obnovení procesu na pozadí., Může být použit s číslem úlohy nebo bez něj. Pokud jej používáte bez čísla úlohy, výchozí úloha se přenese do popředí. Proces stále běží na pozadí. Nemůžete do něj odeslat žádný vstup.
Pokud vydáme příkaz bg
, budeme pokračovat v našem příkazu ping
příkaz:
bg
ping
příkaz se obnoví a znovu uvidíme rolovací výstup v okně terminálu. Zobrazí se název příkazu, který byl restartován., To je zvýrazněno na snímku obrazovky.
ale máme problém. Úkol běží na pozadí a nepřijme vstup. Tak jak to zastavíme? Ctrl+C
nedělá nic. Můžeme to vidět, když to zadáme,ale úkol na pozadí neobdrží ty stisky kláves, takže se vesele vzdaluje.
ve skutečnosti jsme nyní v podivném smíšeném režimu. Můžeme zadat okno terminálu, ale to, co píšeme, je rychle smeteno rolovacím výstupem z příkazu ping
. Vše, co napíšeme, se projeví v popředí.,
Chcete-li zastavit náš úkol na pozadí, musíme jej přenést do popředí a poté jej zastavit.
příkaz fg
příkazfg
přinese úkol na pozadí do popředí. Stejně jako příkaz bg
může být použit s číslem úlohy nebo bez něj. Použití s číslem úlohy znamená, že bude pracovat na konkrétní práci. Pokud se používá bez čísla úlohy, použije se poslední příkaz, který byl odeslán na pozadí.
Pokud zadámefg
nášping
příkaz bude přiveden do popředí., Znaky, které zadáme, jsou smíchány s výstupem z příkazu ping
, ale jsou provozovány shellem, jako by byly zadány na příkazovém řádku jako obvykle. A ve skutečnosti, z pohledu Bash shell, to je přesně to, co se stalo.
fg
a nyní, když máme příkaz ping
spuštěný v popředí ještě jednou, můžeme použít Ctrl+C
k jeho zabití.
Ctrl+C
musíme poslat správné signály
to nebylo úplně hezké., Je zřejmé, že spuštění procesu na pozadí funguje nejlépe, když proces nevytváří výstup a nevyžaduje vstup.
ale, chaotický nebo ne, náš příklad dosáhl:
- uvedení procesu do pozadí.
- obnovení procesu do běžícího stavu na pozadí.
- vrací proces do popředí.
- ukončení procesu.
při použití Ctrl+C
a Ctrl+Z
vysíláte signály do procesu. Jedná se o krátké způsoby použití příkazu kill
., Existuje 64 různých signálů, které kill
může odeslat. Pomocíkill -l
na příkazovém řádku je vypsat. kill
není jediným zdrojem těchto signálů. Některé z nich jsou automaticky zvýšeny jinými procesy v systému
zde jsou některé z běžně používaných.
- SIGHUP: Signal 1. Automaticky odeslán do procesu, když je terminál, ve kterém běží, uzavřen.
- SIGINT: signál 2. Odesláno do procesu, který stisknete
Ctrl+C
. Proces je přerušen a řečeno ukončit., - SIGQUIT: signál 3. Odesláno do procesu, pokud uživatel odešle signál ukončení
Ctrl+D
. - SIGKILL: Signal 9. Proces je okamžitě zabit a nebude se pokoušet uzavřít čistě. Proces neklesá elegantně.
- SIGTERM: signál 15. Toto je výchozí signál odeslaný
kill
. Jedná se o standardní signál ukončení programu. - SIGTSTP: signál 20. Odesláno do procesu při použití
Ctrl+Z
. Zastaví proces a vloží jej do pozadí.,
musíme použít příkazkill
k vydávání signálů, které jim nejsou přiřazeny kombinace kláves.
další kontrola úlohy
proces přesunut do pozadí pomocí Ctrl+Z
je umístěn v zastaveném stavu. Musíme použít příkaz bg
, abychom jej znovu spustili. Spuštění programu jako běžícího procesu na pozadí je jednoduché. Připojte ampersand &
na konec příkazového řádku.,
přestože je nejlepší, aby procesy na pozadí nepsaly do okna terminálu, použijeme příklady, které Ano. Musíme mít na snímcích něco, na co můžeme odkazovat. Tento příkaz spustí nekonečnou smyčku jako proces na pozadí:
zatímco je to pravda;dělat echo „jak na Geek Loop proces“; spánek 3; hotovo &
je nám řečeno číslo úlohy a ID procesu procesu procesu. Naše číslo práce je 1 a ID procesu je 1979. Tyto identifikátory můžeme použít k řízení procesu.,
výstup z naší nekonečné smyčky se začíná objevovat v okně terminálu. Stejně jako dříve můžeme použít příkazový řádek, ale všechny příkazy, které vydáme, jsou rozptýleny výstupem z procesu smyčky.
ls
k zastavení našeho procesu můžeme použít jobs
, abychom si připomněli, jaké je číslo úlohy,a poté použijte kill
.
jobs
hlásí, že náš proces je číslo úlohy 1. Chcete-li použít toto číslo s kill
, musíme předejít znaménkem procenta %
.,
jobs
kill %1
kill
odešle SIGTERM
signál, signál číslo 15, proces a je ukončena. Po dalším stisknutí klávesy Enter se zobrazí stav úlohy. Uvádí proces jako “ ukončen.“Pokud proces nereaguje na příkaz kill
, můžete jej vzít do zářezu. Použijte kill
s , číslo signálu 9. Stačí zadat číslo 9 mezi příkazemkill
číslo úlohy.,
kill 9 %1
Věci, které Jsme prošli
- Ctrl+C-Vyšle
SIGINT
, signál 2, k procesu—je-li akceptovat vstup—a říká to ukončit. - Ctrl + D: odešle
SISQUIT
, signál 3, do procesu-pokud přijímá vstup-a řekne mu, aby přestal. - Ctrl+Z: Odešle
SIGSTP
, signál 20, k procesu, a řekne to zastavit (přerušit) a stal proces na pozadí. - úlohy: uvádí úlohy na pozadí a zobrazuje jejich číslo úlohy.
- bg job_number: restartuje proces na pozadí., Pokud neposkytnete číslo úlohy, použije se poslední proces, který byl změněn na úkol na pozadí.
- FG job_number: přináší proces pozadí do popředí a restartuje jej. Pokud neposkytnete číslo úlohy, použije se poslední proces, který byl změněn na úkol na pozadí.
- příkazový řádek &: přidání ampersand
&
na konec příkazového řádku provede tento příkaz jako úkol na pozadí, který je spuštěn. - kill % job_number: odešle
SIGTERM
, signál 15, do procesu jej ukončit., - kill 9% job_number: odešle
SIGKILL
, signál 9, do procesu a ukončí jej náhle.
SOUVISEJÍCÍ: Jak zabít procesy z terminálu Linux
Dave McKay poprvé použil počítače, když děrovaná papírová páska byla v módě, a od té doby programuje. Po více než 30 letech v IT průmyslu je nyní technologickým novinářem na plný úvazek., Během své kariéry pracoval jako programátor na volné noze, manažer mezinárodního týmu pro vývoj softwaru, projektový manažer IT služeb a naposledy jako pracovník pro ochranu údajů. Dave je Linux evangelista a open source advokát.Přečtěte si celý Bio “