Řízení práce

Správa úloh v operačních systémech podobných UNIXu je sada nástrojů pro manipulaci s dávkovými úlohami prostředí UNIX , zejména v interaktivním režimu, kde „úloha“ je reprezentace shellu pro skupinu procesů .

Nejjednodušeji bude řízení úlohy spočívat v pozastavení, obnovení nebo ukončení provádění úlohy (tj. všech procesů ve skupině procesů), ale může také zahrnovat odeslání jiného signálu do úlohy . Na rozdíl od konceptu bloku řízení úloh (  používaného pro sériové spouštění v dávkovém režimu) zahrnuje řízení úloh vlastní sadu nástrojů pro práci s dávkovým režimem z interaktivních nástrojů.

Přehled

Většina uživatelských úloh [1] při běhu přes terminál (nebo emulátor terminálu ) – procházení adresářů, úpravy souborů atd. – je řešena přenesením řízení na programy, vrácením řízení do shellu, když program ukončí prostřednictvím standardního vstupu a standardního výstupu. do shellu čte z terminálu nebo do něj zapisuje a přijímá signály odeslané z klávesnice, jako je Control+ C.

Někdy však může uživatel potřebovat provést úlohu pomocí terminálu pro jiný účel – úloha, která běží, ale nepřijímá vstup z terminálu, se nazývá úloha na pozadí, zatímco jediná úloha, která přijímá vstup z terminálu, se nazývá úloha na popředí. Job Control je nástroj navržený tak, aby to umožňoval a umožňuje uživateli spouštět procesy na pozadí, odesílat procesy v popředí na pozadí, přenášet proces na pozadí do popředí a spouštět a zastavovat procesy ( pozastavit, obnovit, ukončit ) . 

Koncept „job“ mapuje koncept jediného příkazu shellu na koncept operačního systému, kde lze jediným příkazem spustit mnoho procesů. Konkrétně se jedna úloha může skládat z mnoha procesů: daný proces může vytvářet další podřízené procesy, které mohou zase vytvářet své vlastní podřízené procesy a tak dále, a jeden příkaz shellu může sestávat z potrubí mnoha souvisejících procesů. Jsou spravovány operačním systémem jako jedna skupina procesů (všechny procesy ve skupině sdílejí stejné PGID) a interní reprezentace skupiny procesů shellu je úloha. To je definováno v POSIX jako: [2]

Sada procesů, včetně potrubí shellu a všech procesů na něm závislých, které jsou všechny členy stejné skupiny procesů.

Skupina procesů tak může být řízena jako jeden shell, jediná úloha. Na úlohu lze odkazovat pomocí handle [3] , ID procesu řízení úlohy je použito vestavěným příkazem shellu k odkazování na úlohu. ID úlohy začínají na %% ; %ndefinuje úlohu s názvem n, zatímco %%definuje aktuální. Další ID úlohy jsou definována v POSIX [4] . Dokumentace Bash odkazuje na (%-prefixed) jako jobspec [5] .

Ovládací prvky úloh a ID úloh se obecně používají pouze při interaktivním použití, kde usnadňují odkazování na skupiny procesů; Ve skriptech se místo toho často používají PGID, protože jsou přesnější a robustnější a řízení procesu je ve výchozím nastavení ve skriptech Bash zakázáno.

Příklad

Uživatel může manipulovat s úkoly v rámci dané relace pomocí vestavěných příkazů shellu, jako jsou jobs, fgnebo bg.

Úloha v diagramu je ekvivalentní skupině procesů. PPID je ID nadřazeného procesu. SID - identifikátor relace. TTY - ovládací terminál.

Historie

Řízení úloh bylo poprvé implementováno v shellu Csh Jimem Culpem [6] a poté v MIPSA v Rakousku s využitím funkcí jádra 4.1 BSD a přijato v shellu Korn (ksh) vyvinutém Bell Labs. Později byl zahrnut do verze SVR4 Bourne (sh) shellu a od té doby existuje ve většině moderních unixových shellů.

Aplikace

Shell obvykle uchovává seznam úloh v tabulce procesů. Příkaz jobs uvádí úlohy na pozadí, které existují v tabulce procesů, spolu s číslem a stavem (zastaveno nebo spuštěno) každého procesu. Příkaz disown lze použít k odstranění úloh z tabulky procesů a jejich převedení z úloh na démony , aby pokračovaly ve vykonávání, i když se uživatel odhlásí .

Úlohu běžící "v popředí" lze zastavit zadáním znaků ( Ctrl+ Z). To odešle signál SIGTSTP do procesní skupiny. Výchozí nastavení SIGTSTPpřikáže příslušným procesům zastavit a přenést řízení do shellu. Proces však může signálový token buď zaregistrovat, nebo ignorovat SIGTSTP. Proces lze také pozastavit signálem SIGSTOP, který nelze zachytit nebo ignorovat.

Zastavená úloha může být obnovena jako úloha na pozadí pomocí příkazu bg shell nebo převedena do popředí pomocí příkazu fg . V obou případech shell odpovídajícím způsobem přesměruje I/O a odešle signál procesu SIGCONT, který způsobí, že operační systém obnoví své provádění. V prostředí Bash lze program spustit jako úlohu na pozadí přidáním ampersandu ( & ) do příkazového řádku; jeho výstup je také směrován na terminál (potenciálně prokládaný s výstupy jiných programů), ale v tomto případě nebude schopen číst ze vstupu terminálu.

Proces na pozadí, který se pokouší číst nebo zapisovat na svůj řídicí terminál , vyšle signál SIGTTIN(pro vstup) nebo SIGTTOU(pro výstup). Tyto signály ve výchozím nastavení zastaví proces, ale lze je zpracovat i jinými způsoby. Shelly často potlačí výchozí akci zastavení, SIGTTOUtakže procesy na pozadí poskytují svůj výchozí výstup pro řídicí terminál. V prostředích kompatibilních s Bash může vestavěné zabíjení signalizovat úlohy podle ID procesu i ID skupiny procesů - signalizací úlohy celé její skupině procesů a úlohy specifikované pomocí ID musí být "zabity" odesláním předpony " % ". Kill může do úkolu poslat jakýkoli signál, ale pokud je záměrem zbavit systém procesů, budou pravděpodobně nejvhodnější signály SIGKILLa SIGTERM(výchozí) . Úlohu spuštěnou v popředí lze trvale zastavit zadáním znaků příkazu "kill process" ( Ctrl+ C).

Poznámky

  1. Zde je „úkol“ netechnický výraz pro nějakou činnost, zatímco „proces“ a „úkol“ jsou specifické pojmy z oblasti operačních systémů.
  2. IEEE Std 1003.1-2001, sekce 3.201, Job Archived 9. října 2010 na Wayback Machine
  3. ID je abstraktní odkaz na prostředek (skupinu procesů) spravovaný externě operačním systémem, proto je to handle
  4. IEEE Std 1003.1-2001, sekce 3.203, Job Control Job ID Archivováno 9. října 2010 na Wayback Machine
  5. 7.1 Základy řízení úloh . Získáno 14. listopadu 2015. Archivováno z originálu dne 29. října 2015.
  6. Předmluva Billa Joye v Anderson, Gail; Paul Anderson. The UNIX C Shell Field Guide  (neopr.) . - Prentice-Hall , 1986. - S. xvii. — ISBN 0-13-937468-X .

Literatura

Odkazy