Jak spouštět a ovládat procesy na pozadí v Linuxu

Použijte prostředí Bash v Linuxu ke správě procesů v popředí a na pozadí. Můžete použít funkce a signály řízení úloh Bash, které vám poskytnou větší flexibilitu ve způsobu spouštění příkazů. Ukážeme vám jak.

Vše o procesech

Kdykoli je program spuštěn v operačním systému Linux nebo Unixu, spustí se proces. „Proces“ je název pro vnitřní reprezentaci spouštěného programu v paměti počítače. Pro každý aktivní program existuje proces. Ve skutečnosti existuje proces pro téměř vše, co běží na vašem počítači. To zahrnuje komponenty vašeho grafické desktopové prostředí (GDE) jako např GNOME nebo KDEa systém démoni které se spouštějí při spuštění.

Proč téměř vše, co běží? No, Bash vestavěné jako např CD, pwd, a alias nemusí mít proces spuštěný (nebo „vytvořený“), když jsou spuštěny. Bash provádí tyto příkazy v rámci instance prostředí Bash, které běží v okně vašeho terminálu. Tyto příkazy jsou rychlé právě proto, že k jejich provedení není třeba spouštět žádný proces. (Můžete zadat nápovědu v okně terminálu a zobrazit seznam vestavěných Bash.)

Procesy mohou běžet v popředí, v takovém případě převezmou váš terminál, dokud nejsou dokončeny, nebo mohou běžet na pozadí. Procesy, které běží na pozadí, neovládají okno terminálu a můžete v něm nadále pracovat. Nebo alespoň neovládají okno terminálu, pokud negenerují výstup na obrazovku.

Špinavý příklad

Začneme jednoduchým pingem trasování běží. Budeme pingovat doménu How-To Geek. To se spustí jako proces v popředí.

ping www.wdzwdz.com

Dostáváme očekávané výsledky, rolováním v okně terminálu dolů. Při spuštěném pingu nemůžeme v okně terminálu dělat nic jiného. Pro ukončení příkazu stiskněte Ctrl+C.

Ctrl+C

Viditelný efekt Ctrl+C je zvýrazněn na snímku obrazovky. ping poskytne krátké shrnutí a poté se zastaví.

Zopakujme si to. Tentokrát ale místo Ctrl+C stiskneme Ctrl+Z. Úkol nebude ukončen. Stane se z toho úkol na pozadí. Získáme kontrolu nad terminálovým oknem, které nám bude vráceno.

ping www.wdzwdz.com
Ctrl+Z

Viditelný efekt stisknutí Ctrl+Z je na snímku obrazovky zvýrazněn.

Tentokrát je nám řečeno, že proces je zastaven. Zastaveno neznamená ukončeno. Je to jako auto na stopce. My jsme to nesešrotovali a nevyhodili. Je stále na cestě, stojí a čeká na odjezd. Proces je nyní úlohou na pozadí.

Příkaz jobs vypíše seznam pracovních míst které byly spuštěny v aktuální relaci terminálu. A protože úlohy jsou (nevyhnutelně) procesy, můžeme je také zobrazit pomocí příkazu ps. Použijme oba příkazy a porovnejme jejich výstupy. Použijeme volbu T (terminál), abychom vypsali pouze procesy, které běží v tomto okně terminálu. Všimněte si, že není nutné používat pomlčku – s volbou T.

jobs
ps T

Příkaz jobs nám říká:

  Jak ukončit aplikace na iPhone X

[1]: Číslo v hranatých závorkách je číslo zakázky. Můžeme to použít k odkazování na úlohu, když ji potřebujeme ovládat pomocí příkazů řízení úlohy.
+: Znaménko + ukazuje, že se jedná o úlohu, která bude provedena, pokud použijeme příkaz řízení úlohy bez konkrétního čísla úlohy. Říká se tomu výchozí úloha. Výchozí úloha je vždy ta, která byla do seznamu úloh přidána naposledy.
Zastaveno: Proces neběží.
ping www.wdzwdz.com: Příkazový řádek, který spustil proces.

Příkaz ps nám říká:

PID: ID procesu procesu. Každý proces má jedinečné ID.
TTY: Pseudoteletyp (okno terminálu), ze kterého byl proces spuštěn.
STAT: Stav procesu.
ČAS: Množství času CPU spotřebovaného procesem.
COMMAND: Příkaz, který spustil proces.

Toto jsou běžné hodnoty pro sloupec STAT:

D: Nepřerušitelný spánek. Proces je ve stavu čekání, obvykle čeká na vstup nebo výstup a nelze jej přerušit.
Já: Nečinný.
R: Běh.
S: Přerušitelný spánek.
T: Zastaveno signálem řízení úlohy.
Z: Proces zombie. Proces byl ukončen, ale nebyl „vyčištěn“ svým nadřazeným procesem.

Za hodnotou ve sloupci STAT může následovat jeden z těchto doplňkových indikátorů:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Můžeme vidět, že Bash má stav Ss. Velké „S“ nám říká, že Bash shell spí a je přerušitelný. Jakmile to budeme potřebovat, odpoví. Malé písmeno „s“ nám říká, že shell je vedoucí relace.

Příkaz ping má stav T. To nám říká, že ping byl zastaven signálem řízení úlohy. V tomto příkladu to byla klávesová zkratka Ctrl+Z, kterou jsme ji umístili na pozadí.

Příkaz ps T má stav R, což znamená běh. + označuje, že tento proces je členem skupiny v popředí. V popředí tedy běží příkaz ps T.

Příkaz bg

Příkaz bg se používá k obnovení procesu na pozadí. Může být použit s nebo bez čísla zakázky. Pokud jej použijete bez čísla úlohy, výchozí úloha se přesune do popředí. Proces stále běží na pozadí. Nemůžete do něj odeslat žádný vstup.

Pokud zadáme příkaz bg, obnovíme příkaz ping:

bg

Příkaz ping se obnoví a v okně terminálu znovu uvidíme rolující výstup. Zobrazí se vám název příkazu, který byl restartován. To je zvýrazněno na snímku obrazovky.

  Jak opravit chybu ERR_CONNECTION_REFUSED v prohlížeči Chrome

Ale máme problém. Úloha běží na pozadí a nepřijímá vstup. Jak to tedy zastavíme? Ctrl+C nic nedělá. Vidíme to, když to píšeme, ale úloha na pozadí tyto úhozy nepřijímá, takže vesele dál pinguje.

Ve skutečnosti jsme nyní v podivném kombinovaném režimu. Můžeme psát v okně terminálu, ale to, co napíšeme, je rychle smeteno rolujícím výstupem příkazu ping. Vše, co napíšeme, se projeví v popředí.

Abychom zastavili naši úlohu na pozadí, musíme ji přenést do popředí a poté ji zastavit.

Příkaz fg

Příkaz fg přenese do popředí úlohu na pozadí. Stejně jako příkaz bg jej lze použít s číslem zakázky nebo bez něj. Použití s ​​číslem zakázky znamená, že bude pracovat na konkrétní zakázce. Pokud se použije bez čísla úlohy, použije se poslední příkaz, který byl odeslán na pozadí.

Pokud napíšeme fg, náš příkaz ping se dostane do popředí. Znaky, které zadáváme, jsou smíchány s výstupem příkazu ping, ale shell je ovládá, jako by byly zadávány na příkazovém řádku jako obvykle. A ve skutečnosti se z pohledu Bash shellu přesně to stalo.

fg

A teď, když máme v popředí znovu spuštěný příkaz ping, můžeme ho zabít pomocí Ctrl+C.

Ctrl+C

Potřebujeme vysílat správné signály

To nebylo zrovna hezké. Spuštění procesu na pozadí evidentně funguje nejlépe, když proces neprodukuje výstup a nevyžaduje vstup.

Ale ať je to chaotické nebo ne, náš příklad dosáhl:

Umístit proces do pozadí.
Obnovení procesu do běžícího stavu na pozadí.
Návrat procesu do popředí.
Ukončení procesu.

Když použijete Ctrl+C a Ctrl+Z , vysíláte do procesu signály. Tyto jsou těsnopisné způsoby pomocí příkazu kill. Existují 64 různých signálů že zabít může poslat. K jejich výpisu použijte kill -l na příkazovém řádku. zabít není jediným zdrojem těchto signálů. Některé z nich jsou vyvolány automaticky jinými procesy v systému

Zde jsou některé z běžně používaných.

SIGHUP: Signál 1. Automaticky odeslán procesu, když je terminál, ve kterém běží, uzavřen.
SIGINT: Signál 2. Odešlete do procesu stisknutím Ctrl+C. Proces je přerušen a je mu řečeno, aby skončil.
SIGQUIT: Signál 3. Odesláno procesu, pokud uživatel odešle signál ukončení Ctrl+D.
SIGKILL: Signál 9. Proces je okamžitě ukončen a nepokusí se čistě ukončit. Proces nejde dolů s grácií.
SIGTERM: Signál 15. Toto je výchozí signál vysílaný killem. Je to standardní signál ukončení programu.
SIGTSTP: Signál 20. Odeslán do procesu, když použijete Ctrl+Z. Zastaví proces a přesune jej do pozadí.

K vydávání signálů, které nemají přiřazené kombinace kláves, musíme použít příkaz kill.

  Co je to „Stan“ a odkud toto jméno pochází?

Další kontrola práce

Proces přesunutý do pozadí pomocí Ctrl+Z je umístěn do zastaveného stavu. K opětovnému spuštění musíme použít příkaz bg. Spuštění programu jako běžícího procesu na pozadí je jednoduché. Připojte ampersand & na konec příkazového řádku.

Ačkoli je nejlepší, aby procesy na pozadí nezapisovaly do okna terminálu, použijeme příklady, které to dělají. Potřebujeme mít na screenshotech něco, na co se můžeme odkazovat. Tento příkaz spustí nekonečnou smyčku jako proces na pozadí:

zatímco pravdivý; opakujte „How-To Geek Loop Process“; spánek 3; Hotovo &

zatímco pravdivý;  dělat echo

Je nám sděleno číslo zakázky a ID procesu procesu. Číslo naší zakázky 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čne objevovat v okně terminálu. Stejně jako dříve můžeme použít příkazový řádek, ale všechny příkazy, které vydáváme, jsou proloženy výstupem z procesu smyčky.

ls

K zastavení našeho procesu můžeme použít úlohy, abychom si připomněli, jaké je číslo úlohy, a pak použít kill.

Jobs hlásí, že náš proces je úloha číslo 1. Chcete-li toto číslo použít s kill, musíme mu předcházet znak procenta %.

jobs
kill %1

kill odešle do procesu signál SIGTERM, signál číslo 15 a ten je ukončen. 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 to zrychlit. Použijte kill se SIGKILL , signál číslo 9. Jednoduše vložte číslo 9 mezi příkaz kill a číslo úlohy.

kill 9 %1

Věci, které jsme probrali

Ctrl+C: Odešle SIGINT, signál 2, do procesu – pokud přijímá vstup – a řekne mu, aby skončil.
Ctrl+D: Odešle SISQUIT, signál 3, procesu – pokud přijímá vstup – a řekne mu, aby skončil.
Ctrl+Z: Odešle SIGSTP, signál 20, procesu a řekne mu, aby se zastavil (pozastavil) a stal se procesem na pozadí.
úlohy: Uvádí seznam úloh na pozadí a zobrazuje jejich číslo úlohy.
bg job_number: Restartuje proces na pozadí. Pokud nezadáte číslo úlohy, použije se poslední proces, který byl převeden na úlohu na pozadí.
fg job_number: přenese proces na pozadí do popředí a restartuje ho. Pokud nezadáte číslo úlohy, použije se poslední proces, který byl převeden na úlohu na pozadí.
příkazový řádek &: Přidáním ampersandu & na konec příkazového řádku se tento příkaz spustí jako úloha na pozadí, která běží.
kill %job_number: Vyšle SIGTERM, signál 15, procesu, aby jej ukončil.
kill 9 %job_number: Vyšle SIGKILL, signál 9, do procesu a náhle ho ukončí.