A UNIX-szerű operációs rendszerek jobkezelése a UNIX shell kötegelt jobok manipulálására szolgáló eszközök készlete , különösen interaktív módban, ahol a „job” egy folyamatcsoport shell-ábrázolása .
Legegyszerűbb esetben a jobvezérlés egy job (vagyis egy folyamatcsoportban lévő összes folyamat) végrehajtásának szüneteltetéséből, folytatásából vagy leállításából áll, de magában foglalhatja egy másik jel küldését is a jobnak . Ellentétben a jobvezérlő blokk fogalmával ( kötegelt módban történő soros végrehajtáshoz használatos), a jobvezérlés egy egyéni eszközkészletet foglal magában az interaktív eszközök kötegelt móddal való munkához.
A legtöbb felhasználói feladat [1] terminálon (vagy terminálemulátoron ) keresztül történő futtatáskor – könyvtárak böngészése, fájlok szerkesztése és így tovább – úgy történik, hogy a vezérlést átadja a programoknak, és a vezérlést visszaadja a shellnek, amikor a program kilép a szabványos bemeneten és a szabványos kimeneten keresztül. a terminálról olvasott shell-re, vagy írjon bele és fogadja a billentyűzetről küldött jeleket, mint például a Control+ C.
Előfordulhat azonban, hogy a felhasználónak más célból kell végrehajtania egy feladatot a terminál használatával – egy olyan feladatot, amely fut, de nem fogadja el a terminálbevitelt, háttérfeladatnak, míg az egyetlen olyan feladatot, amely fogadja a terminál bemenetét, előtérbeli jobnak nevezzük. A Job Control egy olyan eszköz, amelyet arra terveztek, hogy ezt lehetővé tegye, és lehetővé teszi a felhasználó számára, hogy folyamatokat indítson a háttérben, előtérbeli folyamatokat küldjön a háttérbe, háttérfolyamatokat állítson előtérbe, és elindítson és leállítson folyamatokat ( felfüggesztés, folytatás, befejezés ) .
A "job" fogalma leképezi az egyetlen shell parancs fogalmát egy operációs rendszer fogalmára, ahol sok folyamat indítható el egyetlen paranccsal. Pontosabban, egyetlen feladat több folyamatból állhat: egy adott folyamat további utódfolyamatokat hozhat létre, amelyek viszont létrehozhatják saját utódfolyamataikat, és így tovább, és egyetlen shell-parancs állhat sok kapcsolódó folyamat folyamatából . Ezeket az operációs rendszer egyetlen folyamatcsoportként kezeli (a csoport összes folyamata ugyanazt a PGID-t használja), és a shell folyamatcsoport belső reprezentációja egy feladat. Ez a POSIX -ben a következőképpen definiálható : [2]
Folyamatok halmaza, beleértve a shell folyamatot és a tőle függő folyamatokat, amelyek mind ugyanannak a folyamatcsoportnak a tagjai.
A folyamatok egy csoportja így egyetlen héjként, egyetlen feladatként kezelhető. A jobra viszont hivatkozhat az [3] leíró , a job vezérlőjének folyamatazonosítóját a shell beépített parancsa használja a jobra való hivatkozáshoz. A munkaazonosítók karakterrel kezdődnek ; nevű feladatot határozza meg , míg az aktuálisat. A többi jobazonosítót a POSIX [4] határozza meg . A Bash dokumentációja a (%-előtaggal) feladatspecifikációként hivatkozik [5] . %%%nn%%
A feladatvezérlőket és a jobazonosítókat általában csak interaktív használatban használják, ahol megkönnyítik a folyamatcsoportokra való hivatkozást; A PGID-ket gyakran használják helyette a szkriptekben, mert pontosabbak és robusztusabbak, és a folyamatvezérlés alapértelmezés szerint le van tiltva a Bash-szkriptekben.
A felhasználó az adott munkameneten belüli feladatokat beépített shell-parancsokkal, például jobs, fgvagy bg.
Ezek a parancsok a shellbe írva...
…megközelítőleg az ilyen folyamatoknak felel meg.
Egy diagramban szereplő feladat egyenértékű egy folyamatcsoporttal. A PPID a szülőfolyamat azonosítója. SID – munkamenet azonosító. TTY - vezérlőterminál.
A Job Controlt először Jim Culp [6] Csh shellben valósította meg, majd az ausztriai MIPSA -nál a 4.1 BSD kernel szolgáltatásait használva , és a Bell Labs által kifejlesztett Korn (ksh) shellben alkalmazta. Később bekerült a Bourne (sh) shell SVR4 verziójába , és azóta a legtöbb modern Unix shellben létezik.
A shell általában a folyamattáblázatban tartja a feladatok listáját. A jobs parancs felsorolja a folyamattáblában létező háttérfeladatokat, valamint az egyes folyamatok számát és állapotát (leállított vagy futó). A disown paranccsal eltávolíthatók a jobok a folyamattáblából, és jobokból démonokká alakíthatók át, így azok akkor is futhatnak, ha a felhasználó kijelentkezik .
CtrlAz "előtérben" futó job karakterek ( + Z) beírásával leállítható . Ez jelet SIGTSTP küld a folyamatcsoportnak. Az alapértelmezett SIGTSTPparancs leállítja a megfelelő folyamatokat, és átadja a vezérlést egy parancsértelmezőnek. A folyamat azonban vagy regisztrálhatja a jel tokent, vagy figyelmen kívül hagyhatja a SIGTSTP. A folyamatot egy olyan jel is megállíthatja, amelyet SIGSTOPnem lehet elfogni vagy figyelmen kívül hagyni.
A leállított job háttérfeladatként folytatható a bg shell paranccsal, vagy előtérbe hozható az fg paranccsal . Mindkét esetben a shell ennek megfelelően átirányítja az I/O -t, és jelet küld a folyamatnak SIGCONT, aminek hatására az operációs rendszer folytatja a végrehajtást. A Bash shellben egy program háttérfeladatként futtatható, ha a parancssorba egy „és” jelet ( & ) adunk; a kimenete is a terminálra van irányítva (potenciálisan más programok kimeneteivel átlapolva), de ebben az esetben nem tud olvasni a terminál bemenetéről.
A háttérfolyamat, amely megpróbál olvasni vagy írni a vezérlő termináljáról , jelet küld SIGTTIN(bemenetre) vagy SIGTTOU(kimenetre). Ezek a jelek alapértelmezés szerint leállítják a folyamatot, de más módon is kezelhetők. A shell-ek gyakran felülírják az alapértelmezett leállítási műveletet SIGTTOU, így a háttérfolyamatok az alapértelmezett kimenetet adják a vezérlő terminálnak. A Bash-kompatibilis shellekben a kill beépített folyamatazonosítóval, valamint folyamatcsoport-azonosítóval is jelezheti a jobokat - úgy, hogy a jobot a teljes folyamatcsoportja felé jelzi, az azonosítóval meghatározott jobokat pedig a " % " előtag elküldésével kell "megölni". SIGKILLA Kill bármilyen jelet küldhet egy feladatnak, de ha a folyamatok rendszerének megszabadítása a cél, akkor valószínűleg a és SIGTERM(alapértelmezett) jelek a legmegfelelőbbek . Az előtérben futó job véglegesen leállítható a "kill process" parancs karaktereinek ( Ctrl+ C) beírásával.