Řízení úloh (Unix) - Job control (Unix)

V Unix a Unix-like operační systémy , kontrola práce se týká řízení o pracovních míst pomocí pláště , zejména interaktivně, kde se „práce“ je reprezentace skořápka na vytvoření skupiny procesů . Základní funkce řízení úloh jsou pozastavení, obnovení nebo ukončení všech procesů ve skupině úloh / procesů; pokročilejší funkce lze provádět odesláním signálů do úlohy. Řízení úloh je v Unixu zvláště zajímavé kvůli jeho multiprocesingu a mělo by se odlišovat od řízení úloh obecně, které se často používá při sekvenčním provádění ( dávkové zpracování ).

Přehled

Když používáte Unix nebo operační systémy podobné Unixu přes terminál (nebo emulátor terminálu ), bude mít uživatel zpočátku spuštěn pouze jeden proces, svůj přihlašovací shell . Většiny úkolů (seznam adresářů, úpravy souborů atd.) Lze snadno provést tak, že necháte program převzít kontrolu nad terminálem a vrátíte kontrolu do shellu, když program skončí - formálně připojením ke standardnímu vstupu a standardnímu výstupu do shellu, který čte nebo zapisuje z terminálu a zachycuje signály odeslané z klávesnice, jako je ukončovací signál vyplývající z stisknutí Control + C .

Někdy však uživatel bude chtít provést úkol, když bude terminál používat k jinému účelu. Úkol, který běží, ale nepřijímá vstup z terminálu, se říká, že běží „na pozadí“, zatímco jediný úkol, který přijímá vstup z terminálu, je „v popředí“. Řízení úloh je zařízení vyvinuté k tomu, aby umožnilo uživateli spouštět procesy na pozadí, odesílat již spuštěné procesy na pozadí, přenést procesy na pozadí do popředí a pozastavit nebo ukončit procesy.

Koncept úlohy mapuje (shell) koncept jednoho příkazu shellu na (operační systém) koncept možná mnoha procesů, které příkaz obsahuje. Úlohy s více procesy vznikají, protože procesy mohou vytvářet další podřízené procesy a jeden příkaz prostředí může sestávat z kanálu více komunikujících procesů. Například příkaz k výběru řádků obsahujících text „title“, seřazení podle abecedy a zobrazení výsledku na pageru .

grep title somefile.txt | sort | less

Tím se vytvoří alespoň tři procesy: jeden pro grep , jeden pro řazení a druhý pro méně . Řízení úloh umožňuje prostředí řídit tyto související procesy jako jednu entitu, a když uživatel vydá příslušnou kombinaci kláves (obvykle Control + Z ), celá skupina procesů bude pozastavena.

Úlohy jsou spravovány operačním systémem jako jedna skupina procesů a úloha je interní reprezentací prostředí takové skupiny. To je definováno v POSIX jako:

Sada procesů, zahrnující potrubí shellu, a všechny procesy z něj odvozené, které jsou všechny ve stejné skupině procesů.

Na úlohu lze odkazovat pomocí popisovače, který se nazývá ID úlohy řízení úlohy, nebo jednoduše ID úlohy , které používá integrované prostředí pro odkazování na úlohu. ID úlohy začínají % znakem; %n identifikuje úlohu n , zatímco %% identifikuje aktuální úlohu. Další ID úloh určuje POSIX . V neformálním použití může být číslo označováno jako „číslo úlohy“ nebo „ID úlohy“ a dokumentace Bash odkazuje na (% -prefixed) ID úlohy jako jobspec.

Řízení úloh a ID úloh se obvykle používají pouze při interaktivním použití, kde zjednodušují odkazování na skupiny procesů; ve skriptování se místo toho používají PGID, protože jsou přesnější a robustnější a ovládání úloh je ve výchozím nastavení ve skriptech bash ve výchozím nastavení zakázáno.

Dějiny

Řízení úloh bylo nejprve implementováno v prostředí C Jimem Kulpem, poté na IIASA v Rakousku s využitím funkcí jádra 4.1 BSD . Korn Shell , vyvinutý v Bellových laboratořích, ji přijal a později byla začleněna do SVR4 verzi Bourne shell a existuje ve většině moderních unixových skořápek.

Příkazy

Standard POSIX určuje dva příkazy pro obnovení pozastavených úloh na pozadí a v popředí, respektive bg a fg . Ty byly modelovány podle příkazů řízení úloh shellu Korn.

Implementace

Prostředí obvykle udržuje seznam úloh v tabulce úloh . Připomeňme, že úloha odpovídá skupině procesů, která se skládá ze všech členů kanálu a jejich potomků. jobs Příkaz vypíše na pozadí pracovních míst existujících v tabulce pracovních míst, spolu s jejich počtem pracovních míst a stav pracovních míst (zastaven nebo spuštěn). Když relace končí, když se uživatel odhlásí (ukončí prostředí, čímž se ukončí proces vedoucí relace ), proces prostředí odešle SIGHUP všem úlohám a čeká na ukončení skupin procesů, než se ukončí.

disown Příkaz lze použít k odstranění úloh z tabulky pracovních míst, takže při ukončení relace podřízené proces skupiny nejsou odeslány SIGHUP, ani dělá shell čekat na jejich ukončení. Stávají se tak osiřelými procesy a mohou být ukončeny operačním systémem, ale častěji se to používá, takže procesy jsou převzaty z init (jádro nastaví svůj nadřazený proces na init) a pokračují ve vykonávání jako démoni . Alternativy zabraňující ukončení úloh zahrnují nohup a použití terminálového multiplexeru .

Úkol spuštěný v popředí lze zastavit zadáním znaku pozastavení ( Ctrl-Z ). To pošle signál "terminál stop" ( SIGTSTP ) do skupiny procesů. Ve výchozím nastavení SIGTSTP způsobí, že procesy, které jej přijímají, se zastaví a řízení se vrátí do shellu. Proces však může zaregistrovat obslužný program signálu pro SIGTSTP nebo jej ignorovat. Proces lze také pozastavit pomocí signálu „stop“ ( SIGSTOP ), který nelze zachytit nebo ignorovat.

Úkol spuštěný v popředí lze přerušit zadáním znaku přerušení ( Ctrl-C ). To odešle signál „přerušení“ ( SIGINT ), který standardně ukončí proces, i když jej lze přepsat.

Zastavenou úlohu lze obnovit jako úlohu na pozadí s bg integrovanou nebo jako úlohu v popředí s fg . V obou případech shell odpovídajícím způsobem přesměruje I / O a odešle signál SIGCONT do procesu, což způsobí, že operační systém obnoví jeho provádění. V Bash lze program spustit jako úlohu na pozadí přidáním ampersand ( & ) do příkazového řádku; jeho výstup je směrován do terminálu (potenciálně prokládaný s výstupem jiných programů), ale nemůže číst ze vstupu terminálu.

Proces na pozadí, který se pokouší číst nebo zapisovat do svého řídicího terminálu, je odeslán signál SIGTTIN (pro vstup) nebo SIGTTOU (pro výstup). Tyto signály ve výchozím nastavení zastavují proces, ale lze s nimi zacházet i jinými způsoby. Mušle často potlačí výchozí akci zastavení SIGTTOU, takže procesy na pozadí ve výchozím nastavení doručují svůj výstup do řídicího terminálu.

Ve skořápkách kompatibilních s Bash může kill vestavěný (ne /bin/kill ) signalizovat úlohy podle ID úlohy i podle ID skupiny procesů - odeslání signálu do úlohy ji odešle celé skupině procesů a úlohy určené ID úlohy by měly být zabity prefixování % . kill může odeslat libovolný signál do úlohy; pokud je však záměrem zbavit systém procesů, jsou nejvhodnější pravděpodobně signály SIGKILL a SIGTERM (výchozí).

Viz také

Poznámky

Reference

Další čtení

externí odkazy