Jak řídit a Kontrolovat Procesy na Pozadí na Linuxu

  • Dave McKay

    @TheGurkha

  • 24. září 2019, v 8:00 EDT
Fatmawati Achmad Zaenuri/.com

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

reklama

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

reklama

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

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.

reklama

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.

reklama

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
reklama

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

reklama

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

reklama

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šleSISQUIT, 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šleSIGTERM, signál 15, do procesu jej ukončit.,
  • kill 9% job_number: odešleSIGKILL, signál 9, do procesu a ukončí jej náhle.

SOUVISEJÍCÍ: Jak zabít procesy z terminálu Linux

Dave McKay
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 “

Leave a Comment