Příkaz spuštění Linuxu na pozadí. Jak spustit program na Linuxu. Mazání čekajících úloh

Úkoly a procesy

Jakýkoli program běžící na Linuxu se nazývá proces. Linux jako multitaskingový systém se vyznačuje tím, že mnoho procesů patřících jednomu nebo více uživatelům může být vykonáváno současně. Pomocí příkazu můžete zobrazit seznam aktuálně spuštěných procesů ps, například takto:

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Upozorňujeme, že ve výchozím nastavení příkaz ps zobrazí seznam pouze těch procesů, které patří uživateli, který jej spustil. Chcete-li zobrazit všechny procesy běžící v systému, musíte zadat příkaz ps -a . Zpracovat čísla(ID procesu nebo PID), uvedené v prvním sloupci, jsou jedinečná čísla, která systém přiřadí každému běžícímu procesu. Poslední sloupec s nadpisem COMMAND označuje název spouštěného příkazu. V tomto případě seznam obsahuje procesy spouštěné samotným uživatelem Larrym. V systému běží mnoho dalších procesů úplný seznam lze zobrazit pomocí příkazu ps-aux. Mezi příkazy spouštěnými uživatelem larry je však pouze bash (příkazový shell pro uživatele larry) a samotný příkaz ps. Je vidět, že bash shell běží souběžně s příkazem ps. Když uživatel zadal příkaz ps, bash shell jej začal provádět. Po týmu ps dokončil svou práci (zobrazí se tabulka procesů), řízení se vrátí do procesu bash. Poté bash shell zobrazí výzvu a čeká na nový příkaz.

Také se nazývá běžící proces úkol(práce). Pojmy proces a úkol se používají zaměnitelně. Obvykle se však proces nazývá úkol, když to znamená řízení práce(kontrola práce). Řízení úloh je funkce příkazového prostředí, která uživateli umožňuje přepínat mezi více úlohami.

Ve většině případů uživatelé spustí pouze jednu úlohu – bude to poslední příkaz, který zadali do příkazového prostředí. Nicméně mnoho shellů (včetně bash a tcsh) má funkce řízení práce(job control), což umožňuje spouštět několik příkazů současně nebo úkoly(zaměstnání) a podle potřeby mezi nimi přepínat.

Správa úloh může být užitečná, pokud například upravujete velký textový soubor a chcete dočasně přerušit úpravy, abyste mohli provést nějakou jinou operaci. Pomocí funkcí správy úloh můžete dočasně opustit editor, vrátit se do příkazového řádku a provést další akce. Po jejich dokončení se můžete vrátit zpět k práci s editorem a najít jej ve stejném stavu, v jakém byl ponechán. Existuje mnoho dalších užitečných využití funkcí správy úloh.

Režim popředí a pozadí

Úkoly mohou být buď popředí(popředí), popř Pozadí(Pozadí). V popředí může být v daný okamžik pouze jeden úkol. Úkol v popředí je úkol, se kterým komunikujete; přijímá vstup z klávesnice a odesílá výstup na obrazovku (pokud jste samozřejmě vstup nebo výstup nepřesměrovali někam jinam). Proti, práce na pozadí nepřijímejte vstup z terminálu; Takové úlohy obvykle nevyžadují interakci uživatele.

Dokončení některých úkolů trvá velmi dlouho a během jejich běhu se neděje nic zajímavého. Příkladem takových úloh je kompilace programů a také komprimace velkých souborů. Není důvod zírat na obrazovku a čekat na dokončení těchto úkolů. Takové práce by měly být spuštěny Pozadí. Během této doby můžete pracovat s jinými programy.

Pro řízení provádění procesů v Linuxu je k dispozici přenosový mechanismus signály. Signál je schopnost procesů vyměňovat si standardní krátké zprávy přímo pomocí systému. Signální zpráva neobsahuje žádné informace kromě čísla signálu (pro usnadnění lze místo čísla použít název předdefinovaný systémem). K přenosu signálu potřebuje proces pouze systémové volání zabít() a abyste mohli přijímat signál, nic nepotřebujete. Pokud proces potřebuje reagovat na signál nějakým speciálním způsobem, může se zaregistrovat psovod a pokud není žádný handler, systém na něj zareaguje. Obvykle to způsobí okamžité ukončení procesu, který přijal signál. Spustí se obsluha signálu asynchronně, okamžitě po přijetí signálu, bez ohledu na to, co proces v danou chvíli dělá.

Dva signály - číslo 9 ( ZABÍT) a 19 ( STOP) - vždy zpracován systémem. První z nich je potřeba k tomu, aby byl proces zaručeně zabit (odtud název). Signál STOP pozastavuje proces: v tomto stavu není proces odstraněn z tabulky procesů, ale není proveden, dokud nepřijme signál 18 ( CONT) - poté bude pokračovat v práci. V příkazovém prostředí Linuxu je signál STOP lze předat aktivnímu procesu pomocí escape sekvence Ctrl -Z .

Signál číslo 15 ( OBDOBÍ) slouží k přerušení práce. Na přerušení(přerušení) pracovní proces zemře. Úlohy jsou obvykle přerušeny únikovou sekvencí Ctrl -C. Neexistuje způsob, jak obnovit přerušenou úlohu. Měli byste si také uvědomit, že některé programy zachycují signál OBDOBÍ(pomocí handleru), takže stisknutím kombinace kláves Ctrl -C o) nesmí proces okamžitě přerušit. To se děje proto, aby program mohl zničit stopy své práce před dokončením. V praxi nelze některé programy takto přerušit vůbec.

Přenos do pozadí a zničení pracovních míst

Začněme s jednoduchý příklad. Podívejme se na příkaz ano, který se na první pohled může zdát zbytečný. Tento příkaz odešle nekonečný proud řetězců sestávajících ze znaku y na standardní výstup. Podívejme se, jak tento příkaz funguje:

/home/larry# ano y y y y y

Posloupnost takových řádků bude pokračovat donekonečna. Tento proces můžete zničit odesláním signálu přerušení, tedy stisknutím Ctrl -C. Dělejme teď věci jinak. Aby se tato nekonečná sekvence nezobrazovala na obrazovce, přesměrujeme standardní výstup příkazu yes na /dev/null . Jak možná víte, zařízení /dev/null funguje jako "černá díra": všechna data odeslaná do tohoto zařízení jsou ztracena. Pomocí tohoto zařízení je velmi pohodlné zbavit se příliš velkého množství výstupu z některých programů.

/home/larry# ano > /dev/null

Nyní se na obrazovce nic nezobrazuje. Výzva prostředí však také není vrácena. Je to proto, že příkaz yes stále běží a posílá své zprávy složené z písmen y do /dev/null . Tento úkol můžete také zničit odesláním signálu přerušení.

Nyní řekněme, že chcete, aby příkaz yes nadále fungoval, ale také aby se na obrazovku vrátila výzva shellu, abyste mohli pracovat s jinými programy. Chcete-li to provést, můžete dát příkaz yes na pozadí a tam bude fungovat, aniž by s vámi komunikoval.

Jedním ze způsobů, jak umístit proces na pozadí, je přidat & na konec příkazu. Příklad:

/home/larry# ano > /dev/null & + 164 /home/larry#

Zpráva je číslo práce(číslo práce) pro proces ano. Příkazový shell přiřadí číslo úlohy každé úloze, kterou spustí. Protože yes je jediná spustitelná úloha, je jí přiřazeno číslo 1. Číslo 164 je identifikační číslo spojené s tímto procesem (PID) a toto číslo je procesu také přiděleno systémem. Jak uvidíme později, k procesu lze přistupovat zadáním obou těchto čísel.

Nyní tedy na pozadí běží proces yes, který nepřetržitě posílá proud y do zařízení /dev/null. Chcete-li zjistit stav tohoto procesu, musíte provést příkaz pracovní místa, což je interní příkaz shellu.

/home/larry# joby + běží ano >/dev/null & /home/larry#

Vidíme, že tento program opravdu funguje. Chcete-li zjistit stav úlohy, můžete také použít příkaz ps, jak je uvedeno výše.

Aby bylo možné přenést signál do procesu (nejčastěji je potřeba přerušit job job) se používá nástroj zabít. Tomuto příkazu je jako argument přiděleno číslo zakázky nebo PID. Nepovinným parametrem je číslo signálu, který je třeba odeslat do procesu. Ve výchozím nastavení je signál odeslán OBDOBÍ. Ve výše uvedeném případě bylo číslo zakázky 1, tedy příkaz zabít %1 přeruší práci. Když se k úloze přistupuje pomocí jejího čísla (spíše než jejího PID), pak tomuto číslu musí na příkazovém řádku předcházet symbol procenta („%“).

Nyní zadáme příkaz pracovní místa znovu pro kontrolu výsledku předchozí akce:

/home/larry# jobs Ukončeno ano >/dev/null

Ve skutečnosti je úloha zničena a při příštím zadání příkazu jobs o ní na obrazovce nebudou žádné informace.

Úlohu můžete také zrušit pomocí identifikačního čísla procesu (PID). Toto číslo spolu s identifikačním číslem úlohy je uvedeno při zahájení úlohy. V našem příkladu byla hodnota PID 164, tedy příkaz zabít 164 by bylo ekvivalentní příkazu zabít %1. Při použití PID jako argumentu příkazu kill nemusíte zadávat znak "%".

Pozastavení a obnovení úloh

Nejprve začněme proces s příkazem yes v popředí, jak bylo provedeno dříve:

/home/larry# ano > /dev/null

Stejně jako dříve, protože proces běží v popředí, výzva shellu se nevrátí na obrazovku.

Nyní místo přerušení úkolu kombinací kláves Ctrl -C, úkol je možný pozastavit(suspend, doslova - pozastavit), vyslat mu signál STOP. Chcete-li úlohu pozastavit, musíte stisknout příslušnou kombinaci kláves, obvykle tuto Ctrl -Z .

/home/larry# ano > /dev/null Ctrl -Z+ Zastaveno ano >/dev/null /home/larry#

Pozastavený proces se jednoduše nespustí. Nespotřebovává prostředky procesoru. Pozastavená úloha může být spuštěna ze stejného bodu, jako by nebyla pozastavena.

Chcete-li obnovit úlohu spuštěnou na popředí, můžete použít příkaz fg(od slova popředí – popředí).

/home/larry# fg ano >/dev/null

Příkazový shell znovu zobrazí název příkazu, aby uživatel věděl, ve které úloze se nachází. tento moment spuštěna v popředí. Pozastavme tento úkol znovu stisknutím kláves Ctrl -Z, ale tentokrát to spustíme na pozadí příkazem bg(od slova pozadí - pozadí). To způsobí, že proces poběží, jako by byl spuštěn pomocí příkazu s & na konci (jak bylo provedeno v předchozí části):

/home/larry# bg + ano $>$/dev/null & /home/larry#

Je vrácena výzva shellu. Nyní tým pracovní místa musí ukázat, že proces Ano aktuálně skutečně pracuje; tento proces lze zabít příkazem zabít, jak se to dělalo dříve.

K pozastavení úlohy běžící na pozadí nelze použít klávesovou zkratku Ctrl -Z. Před pozastavením úlohy je třeba ji pomocí příkazu uvést do popředí fg a teprve potom přestat. Tedy příkaz fg lze použít buď na pozastavené úlohy, nebo na úlohu běžící na pozadí.

Mezi úlohami na pozadí a pozastavenými úlohami je velký rozdíl. Pozastavený úkol nefunguje – nejsou na něj utraceny žádné peníze výpočetní výkon procesor. Tato úloha neprovádí žádnou akci. Pozastavená úloha zabírá určité množství paměti RAM počítače; po nějaké době jádro přečerpá tuto část paměti HDD « poste restante" Naproti tomu běží úloha na pozadí, využívá paměť a dělá některé věci, které byste mohli chtít udělat, ale zároveň můžete pracovat na jiných programech.

Úlohy běžící na pozadí se mohou pokusit zobrazit na obrazovce nějaký text. To bude překážet při práci na jiných úkolech.

/home/larry# ano &

Zde nebyl standardní výstup přesměrován na zařízení /dev/null, takže se na obrazovku vytiskne nekonečný proud y znaků. Toto vlákno nelze zastavit kvůli kombinaci kláves Ctrl -C neovlivňuje úlohy na pozadí. Chcete-li tento výstup zastavit, musíte použít příkaz fg, čímž se úkol dostane do popředí a následně úkol zničíte kombinací kláves Ctrl -C .

Ještě jednu poznámku. Obvykle podle týmu fg a tým bg ovlivnit ty úlohy, které byly naposledy pozastaveny (tyto úlohy budou označeny symbolem + vedle čísla úlohy, pokud zadáte příkaz pracovní místa). Pokud je spuštěna jedna nebo více úloh současně, lze úlohy umístit do popředí nebo na pozadí zadáním příkazů jako argumentů fg nebo příkazy bg jejich identifikační číslo (job ID). Například příkaz fg %2 umístí úlohu číslo 2 dopředu a příkaz bg %3 staví úlohu číslo 3 do pozadí. Použijte PID jako argumenty příkazu fg A bg je to zakázáno.

Navíc, chcete-li úlohu dostat do popředí, můžete jednoduše zadat její číslo. Ano, tým %2 bude ekvivalentní příkazu fg %2 .

Je důležité si uvědomit, že funkce řízení úlohy patří do shellu. Týmy fg , bg A pracovní místa jsou interní týmy skořápky. Pokud z nějakého důvodu používáte příkazový shell, který nepodporuje funkce správy úloh, pak v něm tyto (a podobné) příkazy nenajdete.

Správa serveru se systémem Linux je často doprovázena několika manipulacemi s příkazy v okně terminálu. Toto je známý obrázek pro ty, kteří spravují servery na Linuxu, a v některých případech je vhodné spouštět příkazy na pozadí. To může být dobře použito v praxi a stojí za zmínku důvody, proč by to mohlo být užitečné:
— Když je terminál přetížen hromadou zpráv a není možné paralelně provádět další akce;
— Pokud zavřete terminál, aktuální proces a jeho podřízené procesy se zastaví;
Tyto problémy lze jednoduše vyřešit, zjednodušeně řečeno musíme běžící proces zcela oddělit od řídicího terminálu.

V tomto příspěvku se podíváme na užitečnou schopnost Linuxu spouštět příkazy na pozadí. Jinými slovy, proces, který spustíte, bude proveden odděleně od řídicího terminálu.

Jak spouštět příkazy nebo procesy na pozadí
Pokud váš proces běží v okně terminálu, můžete jej pozastavit pomocí příkazu Ctrl+Z, pravděpodobně to mnoho lidí ví a bude si myslet, no a co. A tady je to, co je zajímavé, když jsme proces pozastavili, můžeme v něm pokračovat na pozadí, k tomu musíme zadat příkaz

Po zadání tohoto příkazu bude proces pokračovat, ale na pozadí. Chcete-li zobrazit všechny procesy běžící na pozadí, můžete zadat příkaz

Podívejme se na jednoduchý příklad, jak to lze aplikovat. Řekněme, že máme soubor , který potřebujeme rozbalit, ale nemáme čas čekat a chceme pracovat paralelně.

Rozbalení archivu na pozadí

$ tar -czf home.tar.gz .

Klikněte Cntr+Z a poté zadejte příkazy

$bg$práce

Druhým způsobem je přidat & na konec příkazu, to řekne systému, aby spustil příkaz na pozadí.

$ tar -czf home.tar.gz . &$práce

Tato metoda umožňuje, aby procesy běžely na pozadí, STDIN, STDOUT, STDERR jsou stále připojeny k terminálu. Nyní se ujistěte, že proces běží, i když je terminál zavřený.

Provedení procesu po zavření okna terminálu
Aby proces běžel i po zavření okna terminálu, můžeme použít příkaz popřít. Proces „odpojí“ od shellu okna terminálu, načež bude spuštěn i po zavření okna konzoly.
Podívejme se na příklad použití standardního příkazu rsync, zkusme jej spustit na pozadí a odpojit proces od terminálu.

$ sudo rsync Templates/* /var/www/html/ & $ job $ disown -h %1 $ job

Můžete také použít příkaz nohup, umožní procesu pokračovat v běhu, i když uživatel opustí systémové prostředí.

$ nohup tar -czf iso.tar.gz Templates/* & $ jobs

Jak oddělit proces od ovládacího terminálu Linuxu
Chcete-li proces zcela oddělit od ovládacího terminálu, můžete také použít příkaz, který bude účinný při použití grafického uživatelského rozhraní (GUI), například prohlížeče Firefox.

$ firefox/dev/null &

V Linuxový systém(a téměř na všech unixových systémech) /dev/null je speciální soubor zařízení, kterému se také říká „nulové zařízení“. Zápis do něj probíhá úspěšně bez ohledu na množství zaznamenaných informací, čtení z něj je ekvivalentní čtení konce souboru (EOF).

Minule jsme mluvili o práci se vstupními, výstupními a chybovými proudy v bash skriptech, deskriptorech souborů a přesměrování streamů. Nyní už víte dost na to, abyste mohli napsat něco vlastního. V této fázi zvládnutí bash můžete mít otázky o tom, jak spravovat běžící skripty a jak automatizovat jejich spouštění.

Dosud jsme zadávali názvy skriptů do příkazového řádku a mačkali Enter, což způsobí okamžité spuštění programů, ale není tomu tak. jediná možnost volací skripty. Dnes si povíme, jak může skript pracovat se signály Linuxu, o různých přístupech ke spouštění skriptů a jejich správě za běhu.

Linuxové signály

V Linuxu existují více než tři desítky signálů, které generuje systém nebo aplikace. Zde je seznam těch nejpoužívanějších, které se při vývoji skriptů jistě budou hodit příkazový řádek.
Signální kód
název
Popis
1
VZDYCHNOUT
Zavírání terminálu
2
SIGINT
Signál k zastavení procesu uživatelem z terminálu (CTRL + C)
3
SIGQUIT
Signál k zastavení procesu uživatelem z terminálu (CTRL + \) s výpisem paměti
9
SIGKILL
Bezpodmínečné ukončení procesu
15
SIGTERM
Signál požadavku na ukončení procesu
17
SIGSTOP
Vynucení pozastavení procesu, ale neukončení
18
SIGTSTP
Pozastavení procesu z terminálu (CTRL+Z), ale bez jeho vypnutí
19
SIGCONT
Pokračujte v provádění dříve zastaveného procesu

Pokud bash shell při zavření terminálu přijme signál SIGHUP, ukončí se. Před ukončením vyšle signál SIGHUP všem procesům, které v něm běží, včetně běžících skriptů.

Signál SIGINT způsobí dočasné zastavení provozu. Linuxové jádro přestane přidělovat čas procesoru shellu. Když k tomu dojde, shell upozorní procesy zasláním signálu SIGINT.

Bash skripty tyto signály neovládají, ale mohou je rozpoznat a provést určité příkazy, aby připravily skript na následky způsobené signály.

Odesílání signálů do skriptů

Shell bash umožňuje odesílat signály do skriptů pomocí klávesových zkratek. To se velmi hodí, pokud potřebujete dočasně zastavit běžící skript nebo ukončit jeho činnost.

Ukončení procesu

Kombinace klávesy CTRL+C vygeneruje signál SIGINT a odešle ho všem procesům běžícím v shellu, čímž způsobí jejich ukončení.

Spusťte v shellu následující příkaz:

100 $ spánku
Poté dokončíme jeho práci kombinací kláves CTRL + C.


Ukončete proces z klávesnice

Dočasné zastavení procesu

Kombinace kláves CTRL + Z generuje signál SIGTSTP, který proces pozastaví, ale neukončí. Tento proces zůstane v paměti a jeho práce může být obnovena. Spusťte příkaz v shellu:

100 $ spánku
A dočasně jej zastavte kombinací kláves CTRL + Z.


Pozastavit proces

Číslo v hranatých závorkách je číslo úlohy, kterou shell přiřadí procesu. Shell zpracovává procesy v něm běžící jako úlohy s jedinečnými čísly. Prvnímu procesu je přiděleno číslo 1, druhému - 2 a tak dále.

Pokud pozastavíte úlohu vázanou na shell a pokusíte se ji ukončit, bash vydá varování.

Pozastavené úlohy můžete zobrazit pomocí následujícího příkazu:

Ps-l


Seznam úkolů

Ve sloupci S, který zobrazuje stav procesu, je T zobrazeno pro pozastavené procesy. To znamená, že příkaz je pozastaven nebo ve stavu trasování.

Pokud potřebujete ukončit pozastavený proces, můžete použít příkaz kill. Můžete si o tom přečíst podrobnosti.

Její hovor vypadá takto:

Kill processID

Zachycování signálu

Chcete-li povolit sledování signálu Linux ve skriptu, použijte příkaz trap. Pokud skript přijme signál zadaný při volání tohoto příkazu, zpracuje jej samostatně, zatímco shell takový signál nezpracuje.

Příkaz trap umožňuje skriptu reagovat na signály, které by jinak shell zpracoval bez jeho zásahu.

Podívejme se na příklad, který ukazuje, jak příkaz trap specifikuje kód, který se má provést, a seznam signálů oddělených mezerami, které chceme zachytit. V tomto případě je to jen jeden signál:

#!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo Toto je testovací skript count=1, zatímco [ $count -le 10 ] do echo "Loop #$count" spánek 1 count=$(($ počítat + 1)) hotovo
Výstup příkazu trap použitý v tomto příkladu textová zpráva kdykoli detekuje signál SIGINT, který lze vygenerovat stisknutím Ctrl + C na klávesnici.


Zachycování signálu

Pokaždé, když stisknete CTRL + C, skript provede příkaz echo zadaný při volání trace, místo aby jej nechal shell ukončit.

Signál ukončení skriptu můžete zachytit pomocí názvu signálu EXIT při volání příkazu trap:

#!/bin/bash past "echo Goodbye..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) hotovo


Zachycení výstupního signálu skriptu

Když skript skončí, buď normálně, nebo kvůli signálu SIGINT, shell zachytí a provede příkaz echo.

Úprava zachycených signálů a zrušení odposlechu

Chcete-li upravit signály zachycené skriptem, můžete spustit příkaz trap s novými parametry:

#!/bin/bash trap "echo "Ctrl-C je v pasti."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) hotovo past "echo "Upravil jsem past!"" SIGINT count=1 zatímco [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) hotovo


Úprava zachycení signálu

Po úpravě budou signály zpracovány novým způsobem.

Zachycení signálu lze také zrušit jednoduchým provedením příkazu trap, předáním dvojité pomlčky a názvu signálu:

#!/bin/bash trap "echo "Ctrl-C je v pasti."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) hotovo past -- SIGINT echo "Právě jsem odstranil past" počet=1 zatímco [ $count -le 5 ] do echo "Druhá smyčka #$count" spánek 1 count=$(($count + 1)) hotovo
Pokud skript přijme signál před zrušením odposlechu, zpracuje jej tak, jak je uvedeno v aktuální tým past. Spustíme skript:

$ ./myscript
A stiskněte CTRL + C na klávesnici.


Signál zachycený před odposlechem byl zrušen.

K prvnímu stisknutí CTRL + C došlo v době provádění skriptu, kdy bylo účinné zachycení signálu, takže skript provedl příkaz echo přiřazený signálu. Poté, co spuštění dosáhlo příkazu unhook, příkaz CTRL + C fungoval jako obvykle a skript byl ukončen.

Spouštění skriptů příkazového řádku na pozadí

Někdy bash skriptům trvá dokončení úkolu dlouho. Možná však budete muset být schopni normálně pracovat na příkazovém řádku bez čekání na dokončení skriptu. Není to tak těžké implementovat.

Pokud jste viděli seznam procesů vystupujících příkazem ps, možná jste si všimli procesů, které běží na pozadí a nejsou svázány s terminálem.
Pojďme napsat následující skript:

#!/bin/bash count=1 while [ $count -le 10 ] spánek 1 count=$(($count + 1)) hotovo
Spustíme to zadáním znaku ampersand (&) za jménem:

$ ./myscript &
To způsobí, že bude spuštěn jako proces na pozadí.


Spuštění skriptu na pozadí

Skript se spustí v procesu na pozadí, jeho identifikátor se zobrazí v terminálu a po dokončení jeho spuštění se zobrazí zpráva o tom.

Všimněte si, že ačkoli skript běží na pozadí, nadále používá terminál k výstupu zpráv do STDOUT a STDERR, což znamená, že text, který vypíše, nebo chybové zprávy budou viditelné v terminálu.


Seznam procesů

S tímto přístupem, pokud ukončíte terminál, skript běžící na pozadí se také ukončí.

Co když chcete, aby skript běžel i po zavření terminálu?

Provádění skriptů, které se neukončí při zavření terminálu

Skripty lze spouštět v procesech na pozadí i po ukončení relace terminálu. K tomu můžete použít příkaz nohup. Tento příkaz vám umožňuje spustit program blokováním signálů SIGHUP odeslaných do procesu. Výsledkem je, že proces bude proveden, i když opustíte terminál, ve kterém byl spuštěn.

Aplikujme tuto techniku ​​při spouštění našeho skriptu:

Nohup ./myscript &
Toto bude výstup na terminál.


Tým nohup

Příkaz nohup odpojí proces od terminálu. To znamená, že proces ztratí odkazy na STDOUT a STDERR. Aby nedošlo ke ztrátě datového výstupu skriptem, nohup automaticky přesměruje zprávy přicházející do STDOUT a STDERR do souboru nohup.out.

Všimněte si, že pokud spustíte více skriptů ze stejného adresáře, jejich výstup skončí v jediném souboru nohup.out.

Zobrazit úkoly

Příkaz jobs vám umožňuje zobrazit aktuální úlohy, které běží v shellu. Pojďme napsat následující skript:

#!/bin/bash count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$(($count + 1)) done
Pojďme to spustit:

$ ./myscript
A dočasně jej zastavte kombinací kláves CTRL + Z.


Spuštění a pozastavení skriptu

Spustíme stejný skript na pozadí a přesměrujeme výstup skriptu do souboru tak, aby na obrazovce nic nezobrazoval:

$ ./myscript > výstupní soubor &
Po provedení příkazu jobs uvidíme informace jak o pozastaveném skriptu, tak o tom, který běží na pozadí.


Získání informací o skriptech

Přepínač -l při volání příkazu jobs označuje, že potřebujeme informace o ID procesů.

Restartování pozastavených úloh

Chcete-li skript restartovat na pozadí, můžete použít příkaz bg.

Spustíme skript:

$ ./myscript
Stiskněte CTRL + Z, čímž dočasně zastavíte jeho provádění. Spusťte následující příkaz:

$bg


příkaz bg

Skript nyní běží na pozadí.

Pokud máte více pozastavených úloh, můžete předat číslo úlohy příkazu bg a restartovat konkrétní úlohu.

Chcete-li znovu spustit úlohu v normální mód použijte příkaz fg:

Plánování spouštění skriptů

Linux poskytuje několik způsobů, jak spouštět bash skripty v daném čase. Jedná se o příkaz at a plánovač úloh cron.

Příkaz at vypadá takto:

V čase [-f název_souboru]
Tento příkaz rozpoznává mnoho formátů času.

  • Standardní, uvádějící hodiny a minuty, například - 10:15.
  • Pomocí indikátorů AM/PM, před nebo po poledni, například - 22:15.
  • Použití speciálních jmen, jako je nyní, poledne, půlnoc.
Kromě možnosti určit čas, kdy by se měla úloha spustit, lze příkazu at také předat datum pomocí jednoho z podporovaných formátů.
  • Standardní formát data, ve kterém je datum zapsáno pomocí vzorů MMDDYY, MM/DD/RR nebo DD.MM.RR.
  • Textové znázornění data, například 4. července nebo 25. prosince, přičemž rok lze zadat nebo se bez něj obejít.
  • Nahrávání jako nyní + 25 minut .
  • Zobrazení záznamu zítra ve 22:15 .
  • Typ záznamu 10:15 + 7 dní.
Nezacházejme hlouběji do tohoto tématu, podívejme se na jednoduchý případ použití příkazu:

$ na -f ./myscript nyní


Plánování úloh pomocí příkazu at

Přepínač -M při volání at se používá k odeslání toho, co skript vypíše e-mailem, pokud je systém odpovídajícím způsobem nakonfigurován. Pokud odesíláte e-mailem není možné, tento přepínač jednoduše potlačí výstup.

Chcete-li zobrazit seznam úloh čekajících na provedení, můžete použít příkaz atq:


Seznam čekajících úkolů

Mazání čekajících úloh

Příkaz atrm umožňuje odstranit čekající úlohu. Při volání uveďte číslo úkolu:

$atrm 18


Mazání úlohy

Spouštějte skripty podle plánu

Naplánování jednorázového spuštění skriptů pomocí příkazu at může v mnoha situacích usnadnit život. Co když ale potřebujete, aby se skript spouštěl každý den ve stejnou dobu, jednou týdně nebo jednou za měsíc?

Linux má nástroj crontab, který vám umožňuje naplánovat skripty, které je třeba pravidelně spouštět.

Crontab běží na pozadí a na základě dat v tzv. cron tabulkách spouští naplánované úlohy.

Chcete-li zobrazit existující tabulku úloh cron, použijte následující příkaz:

$ crontab –l
Při plánování spuštění skriptu podle plánu přijímá crontab data o tom, kdy je třeba úlohu provést, v následujícím formátu:

Minuta, hodina, den v měsíci, měsíc, den v týdnu.
Pokud například chcete, aby se určitý skript s názvem příkaz spouštěl každý den v 10:30, bude to odpovídat následující položce v tabulce úloh:

30 10 * * * příkaz
Zde zástupný znak "*" použitý pro pole dne v měsíci, měsíci a dni v týdnu znamená, že cron by měl příkaz spouštět každý den v měsíci v 10:30.

Pokud například chcete, aby se skript spouštěl každé pondělí v 16:30, budete muset v tabulce úloh vytvořit následující položku:

30 16 * * 1 příkaz
Číslování dnů v týdnu začíná od 0, 0 znamená neděli, 6 znamená sobotu. Zde je další příklad. Zde bude příkaz vykonán ve 12 hodin prvního dne každého měsíce.

00 12 1 * * příkaz
Měsíce se počítají od 1.
Chcete-li přidat položku do tabulky, musíte zavolat crontab pomocí přepínače -e:

Crontab –e
Poté můžete zadat příkazy pro generování plánu:

30 10 * * * /home/likegeeks/Desktop/myscript
Díky tomuto příkazu bude skript volán každý den v 10:30. Pokud narazíte na chybu „Prostředek dočasně nedostupný“, spusťte níže uvedený příkaz jako root:

$ rm -f /var/run/crond.pid
Pravidelné spouštění skriptů pomocí cronu můžete organizovat ještě snadněji pomocí několika speciálních adresářů:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Umístění souboru skriptu do jednoho z nich způsobí, že se bude spouštět každou hodinu, denně, týdně nebo měsíčně.

Spouštějte skripty při přihlášení a spuštění shellu

Můžete automatizovat spouštění skriptů na základě různých událostí, jako je přihlášení uživatele nebo spuštění shellu. Můžete si přečíst o souborech, které jsou v takových situacích zpracovávány. Jedná se například o následující soubory:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Chcete-li spustit skript při přihlášení, umístěte jeho volání do souboru .bash_profile.

A co spouštění skriptů při otevření terminálu? Soubor .bashrc vám to pomůže uspořádat.

Výsledek

Dnes jsme diskutovali o otázkách týkajících se managementu životní cyklus skripty, mluvili jsme o tom, jak spouštět skripty na pozadí, jak naplánovat jejich provádění. Příště si přečtěte o funkcích v bash skriptech a vývoji knihoven.

Vážení čtenáři! Používáte nástroje k plánování spouštění skriptů příkazového řádku podle plánu? Pokud ano, řekněte nám o nich.

Terminálová služba Linux běží ve výchozím nastavení v režimu jednoho úkolu. To znamená, že jakákoli vypuštěná posádka zablokuje terminál, dokud nebude dokončen. Tento přístup není vhodný při spouštění programů, které vyžadují dlouhou dobu provádění. Tento problém lze vyřešit dvěma způsoby: otevřít další okno terminálu a provést v něm další příkaz, nebo použít režim na pozadí. Všechny současné operační systémy, včetně Linuxu, jsou multitaskingové, což znamená schopnost současně spouštět více programů.

Jak mohu spustit brigádu na pozadí, abych měl okamžitý přístup k rozhraní příkazového řádku? Posádka, která byla nucena běžet, se nazývá proces na pozadí. Procesy na pozadí se na obrazovce nezobrazují. Například server Apache HTTPD běží na pozadí, aby obsluhoval webové stránky. Shell skript nebo jakýkoli příkaz můžete přepnout do režimu nízké priority. Úkol (například posádka nebo skript) lze umístit na pozadí přidáním „&“ na konec příkazového řádku. Tento příkaz přesune příkaz do pozadí a uvolní místo v terminálu. Tým, který běží na pozadí, se nazývá práce. Zatímco běží příkaz na pozadí, je možné provádět jakékoli další příkazy. Syntaxe je následující:

příkaz & název-scriptu & /cesta/k/příkazu arg1 arg2 & příkaz-1 | příkaz-2 arg1 & příkaz-1 | příkaz-2 -arg1 -arg2 >/cesta/k/výstupu &

Chcete-li spouštět programy na pozadí bez blokování okna terminálu, musíte použít speciálního instruktora „&“. Umístěte tento znak na úplný konec řádku po zadání názvu příkazu, voleb a vstupních parametrů. V obecný pohled tuto sekvenci lze zadat jako „název_příkazu -volba vstupní_parametr &“.

ls ~/* > ~/test-file.txt &
18960

Po stisknutí tlačítka Enter se program automaticky spustí na pozadí. V tomto případě terminál zobrazí řádek s následujícím obsahem „[číslo_úlohy] identifikátor_procesu“ a vyzve vás k zadání nově vytvořeného příkazu.

Najděte příkazy běžící na pozadí v Linuxu

Spusťte následující příkaz:

Příklad výstupu dat:

Spuštění find / -name "*.c" 2> /dev/null > /tmp/output.txt &
+ Spuštění grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Kde jsou identifikátory objednávky.

Chcete-li zobrazit ID procesů pro ID úloh kromě standardních přetypování, předejte volbu -l:

Příklad výstupu dat:

7307 Spuštění find / -name "*.c" 2> /dev/null > /tmp/output.txt &
+ 7324 Spuštění grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Chcete-li zobrazit pouze ID procesů, zadejte:

Příklad výstupu dat:

Zastavte provádění příkazů běžících na pozadí

Chcete-li násilně nebo elegantně ukončit proces, použijte příkaz kill. Syntaxe je následující:

zabít PID
zabít -15 PID
zabít -9 PID
killall proces-Jméno-Tady
killall -15 proces-Jméno-Tady
killall -9 process-Name-Here

Návrat programu do režimu popředí v Linuxu

Linux vám umožňuje nejen spouštět programy na pozadí, ale také je v případě potřeby vrátit k normálnímu provádění. K tomu existují dva nástroje: příkaz ( Tým je skupina lidí, které spojují společné motivy a zájmy.) fg a operátor %. Princip jejich snahy je extrémně jednoduchý. fg vyžaduje zadání čísla úlohy jako parametru a musí být nahrazeno % bezprostředně za operátorem bez mezer.

find / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: úkol ukončen
+ Konec 1 find / -name .ini 2> ~/results.txt

Operační systém se v podstatě skládá z jádra a obrovské sady programů, které jsou navrženy tak, aby vykonávaly různé úkoly, udržovaly systém a vyhovovaly potřebám uživatele. Téměř veškerá interakce mezi uživatelem a operačním systémem probíhá prostřednictvím programů. Proto je pro začátečníky důležité, aby pochopili, jak spustit program v Linuxu, co se děje při spouštění a jaké jsou způsoby spouštění.

Než přejdeme ke spouštění programů, musíme nejprve pochopit, co to program je. V Linuxu se programy liší od ostatních souborů pouze tím, že mají nastaven příznak spustitelného programu. O tom jsem již podrobně psal v článku, takže se nebudu opakovat.

Všechny programy lze rozdělit do několika typů:

  • Binární programy- obsahují instrukce pro procesor, které jsou připraveny k provedení, většina programů je v tomto formátu, jsou rychlé a systémem je provádí okamžitě;
  • Bytecode programy- již se nejedná o instrukce procesoru, ale o instrukce konkrétního virtuálního stroje, který je může provádět, bez virtuálního stroje nelze takové příkazy provádět. Takové programy spotřebovávají více zdrojů, ale jsou také poměrně rychlé, jejich výhodou je, že je lze spustit bez úprav kdekoli, kde mohou fungovat virtuální stroj. Mezi takové programy patří programy Java.
  • Skriptovací programy- tyto programy se skládají ze sady příkazů v prostém textu, které jsou prováděny speciálním interpretem. Takové programy jsou pomalejší, ale snáze se vyvíjejí a jejich kód lze snadno a rychle měnit.

Nyní přejdeme ke spouštění programů.

Spouštění programů v terminálu

Zpočátku na operačních sálech Unixové systémy a Linux neměl grafické rozhraní, takže programy byly spouštěny pomocí příkazů z terminálu. Nyní je to také možné a je poměrně aktivně využíváno zkušenými uživateli. Syntaxe spuštění programu vypadá takto:

/cesta/k/souboru/programu možnosti

Parametry se zadávají pouze tehdy, když jsou potřeba, ale shell musí vždy znát úplnou cestu k programu. Vše za názvem programu a mezerou jsou parametry. Pravděpodobně jste si již všimli, že při spouštění programů obvykle neuvádíme úplnou cestu. Bylo by to velmi dlouhé a nepohodlné.

Vývojáři přišli s řešením. Byla vytvořena proměnná PATH, která ukládá všechny cesty ke složkám, kde se programy obvykle nacházejí - /bin, /sbin, /usr/bin, /usr/sbin a tak dále. Jeho obsah můžete zobrazit příkazem:

Když zadáte název programu, systém vyhledá spustitelný soubor s tímto názvem ve všech složkách z PATH, a pokud jej najde, spustí jej. Pokud takový soubor neexistuje, zobrazí se zpráva „příkaz nenalezen“. Chcete-li tedy spustit některý ze systémových programů, stačí zadat jeho název spustitelný soubor, Například:

A za mezerou můžete předat parametry:

Pokud program není v těchto adresářích, musíte k němu zadat úplnou cestu:

/usr/local/bin/ls1

Pokud chcete spustit program přes terminál ubuntu, který se nachází v aktuální složce, pak bude situace mírně odlišná. Systém prohledává pouze složky v proměnné PATH, neprohledává aktuální adresář. Pokud tedy zadáte název spustitelného souboru, zobrazí se chyba. Musíte zadat úplnou cestu, jak si pamatujete, že bude./:

Někdy je nutné přenést nějakou specialitu. Například proměnná EDITOR označuje které textový editor by měl být použit jako výchozí. Před názvem příkazu můžete zadat název proměnné a její hodnotu pomocí syntaxe:

název_proměnné = příkaz hodnota

Například:

EDITOR=nano video

Ve výchozím nastavení tento příkaz otevře nastavení v editoru Vim, ale s tímto proměnná prostředí nastavení se otevře v nano editoru.

Spouštění programů jako jiný uživatel

Již víte, jak program spustit linuxový terminál, a co ostatní uživatelé? Ve Windows je zcela běžné spouštět programy jako správce, aby program mohl získat více přístupových práv v systému. Na Linuxu k tomu slouží utilita sudo. Její jméno lze dešifrovat jako sčarodějnice u ser dělat- změnit uživatele a spustit. Ve výchozím nastavení nástroj spustí příkaz jako superuživatel root:

příkaz sudo
sudo whoami

Ale pomocí volby -u můžete program spustit jako jakýkoli uživatel přihlášený do systému:

příkaz sudo -u uživatelské jméno
sudo -u postgres whoami

Příkaz whoami (kdo jsem) zobrazuje jméno aktuálního uživatele.

Jak spustit program na pozadí

Někdy je nutné spustit v terminálu dlouho běžící program, aby nepřekážel v další práci. Chcete-li to provést, můžete použít spuštění programu na pozadí v systému Linux:

název_programu &

Například:

dd if=/dev/zero of=~/počet souborů=100000 &

Systém vypíše PID, jedinečný identifikátor programu, který pak můžete použít k uzavření:

Jak spustit skript na Linuxu

Již jsme si řekli, že programy se dělí na binární a interpretované. Dříve jsme mluvili pouze o binárních programech. Ke spuštění interpretovaných programů potřebujete přímo tlumočníka, mezi takové programy patří programy napsané v jazycích jako Java, Python, Perl, Ruby, PHP, NodeJS a mnoho dalších. Syntaxe pro spuštění takového programu je odlišná:

tlumočník /cesta/k/souboru/programu možnosti

Různí interpreti se chovají odlišně, proto je lepší rovnou zadat úplnou cestu k programu. Python obvykle vybírá skripty z aktuální složky, aniž by uváděl úplnou cestu:

python hellowrld.py

A programy Java je třeba spouštět takto:

java -jar program.jar

U interpretovaných programových souborů je příznak spustitelnosti volitelný, protože jsou předány jako parametr hlavnímu programu. Výjimkou jsou pouze Bash skripty. Skript můžete spustit s interpretem:

Nebo stačí zadat cestu ke skriptu:

Shell sám určuje své skripty podle příznaku spustitelnosti a provádí je. Pokud není nastaven příznak spustitelnosti, měli byste jej přidat:

sudo chmod u+x ./script.sh

Proto byly pro většinu interpretovaných programů vytvořeny jednoduché sh skripty, které lze rychle spustit.

Spouštění linuxových programů v GUI

Mnohem pohodlnější je spouštět programy přes grafické rozhraní. Pokud není možné spustit konzolové programy tímto způsobem, pak existují zkratky pro všechny grafické nástroje, které najdete v hlavní nabídce systému:

Případně můžete program spustit z správce souborů, dvojitým kliknutím myši, ale pak pro něj musí být nastaven příznak spustitelnosti.

Spouštění skriptů grafické rozhraní. Všechny zástupce nabídky naleznete v adresáři /usr/share/applications/. Jakýkoli program lze spustit dvojitým kliknutím odtud. Ale podívejme se, co je uvnitř zkratky; Chcete-li to provést, otevřete ji v textovém editoru:


Řádek Exec mimo jiné určuje příkaz, který se spustí linuxové programy když dvakrát kliknete na zástupce. Můžete si vzít jednu ze stávajících zkratek a vytvořit si na jejím základě vlastní. Toto je pouze název programu. Je však důležité poznamenat, že je lepší zadat úplnou cestu na místech, jako jsou zástupci, skripty, cron atd., Tím se sníží počet chyb, protože nemůžete vědět, zda systém v tomto případě kontroluje PATH nebo hledat program pouze v aktuálním adresáři. Nyní víte vše o tom, jak spustit program na Linuxu.

závěry

V tomto článku jsme se podívali na to, jak spustit program přes terminál ubuntu nebo v jiném Linuxové distribuce. I když se to zdá jako velmi jednoduché téma, existuje několik zajímavých bodů, které mohou být užitečné. Ale vy už o nich víte. Pokud máte nějaké dotazy, zeptejte se v komentářích!