Príkaz na spustenie systému Linux na pozadí. Ako spustiť program v systéme Linux. Odstraňujú sa čakajúce úlohy

Úlohy a procesy

Akýkoľvek program bežiaci na Linuxe sa nazýva proces. Linux ako multitaskingový systém je charakteristický tým, že mnoho procesov patriacich jednému alebo viacerým používateľom môže byť vykonávaných súčasne. Pomocou príkazu môžete zobraziť zoznam práve spustených procesov ps, naprí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 v predvolenom nastavení je príkaz ps zobrazí zoznam iba tých procesov, ktoré patria používateľovi, ktorý ho spustil. Ak chcete zobraziť všetky procesy spustené v systéme, musíte zadať príkaz ps -a . Procesné čísla(ID procesu alebo PID), uvedené v prvom stĺpci, sú jedinečné čísla, ktoré systém priraďuje každému bežiacemu procesu. Posledný stĺpec s nadpisom COMMAND označuje názov spúšťaného príkazu. V tomto prípade zoznam obsahuje procesy spustené samotným užívateľom Larrym. V systéme beží mnoho ďalších procesov úplný zoznam možno zobraziť pomocou príkazu ps-aux. Medzi príkazmi spúšťanými používateľom larry je však iba bash (príkazový shell pre používateľa larry) a samotný príkaz ps. Je možné vidieť, že bash shell beží súčasne s príkazom ps. Keď používateľ zadal príkaz ps, bash shell ho začal vykonávať. Po tíme ps dokončil svoju prácu (zobrazí sa tabuľka procesov), riadenie sa vráti do bash procesu. Potom bash shell zobrazí výzvu a čaká na nový príkaz.

Bežiaci proces sa tiež nazýva úloha(zamestnanie). Pojmy proces a úloha sa používajú zameniteľne. Zvyčajne sa však proces nazýva úloha, keď to znamená riadenie práce(kontrola práce). Riadenie úloh je funkcia príkazového prostredia, ktorá používateľovi dáva možnosť prepínať medzi viacerými úlohami.

Vo väčšine prípadov používatelia spustia iba jednu úlohu – toto bude posledný príkaz, ktorý zadali do príkazového prostredia. Mnohé shelly (vrátane bash a tcsh) však majú funkcie riadenie práce(job control), umožňujúci spustiť niekoľko príkazov súčasne resp úlohy(pracovné miesta) a podľa potreby medzi nimi prepínať.

Správa úloh môže byť užitočná, ak napríklad upravujete veľký súbor textový súbor a chcete dočasne prerušiť úpravy, aby ste mohli vykonať nejakú inú operáciu. Pomocou funkcií správy úloh môžete dočasne opustiť editor, vrátiť sa do príkazového riadka a vykonať ďalšie akcie. Keď sú hotové, môžete sa vrátiť späť k práci s editorom a nájsť ho v rovnakom stave, v akom bol ponechaný. Funkcie správy úloh majú oveľa užitočnejšie využitie.

Režim popredia a pozadia

Úlohy môžu byť buď popredia(v popredí), príp pozadie(pozadie). V popredí môže byť v danom čase iba jedna úloha. Úloha v popredí je úloha, s ktorou komunikujete; prijíma vstup z klávesnice a odosiela výstup na obrazovku (pokiaľ ste, samozrejme, vstup alebo výstup nepresmerovali niekam inam). proti, pracovné miesta na pozadí neprijímajte vstup z terminálu; Takéto úlohy zvyčajne nevyžadujú interakciu používateľa.

Dokončenie niektorých úloh trvá veľmi dlho a počas ich spustenia sa nedeje nič zaujímavé. Príkladom takýchto úloh je kompilácia programov, ako aj kompresia veľkých súborov. Nie je dôvod pozerať sa na obrazovku a čakať na dokončenie týchto úloh. Takéto úlohy by sa mali vykonávať pozadie. Počas tejto doby môžete pracovať s inými programami.

Na riadenie vykonávania procesov v systéme Linux je k dispozícii mechanizmus prenosu signály. Signál je schopnosť procesov vymieňať si štandardné krátke správy priamo pomocou systému. Signálna správa neobsahuje žiadne informácie okrem čísla signálu (pre pohodlie je možné namiesto čísla použiť názov preddefinovaný systémom). Na prenos signálu potrebuje proces iba systémové volanie zabiť () a na príjem signálu nepotrebujete nič. Ak proces potrebuje reagovať na signál nejakým špeciálnym spôsobom, môže sa zaregistrovať psovod, a ak tam nie je žiadny handler, systém naň zareaguje. Zvyčajne to spôsobí okamžité ukončenie procesu, ktorý prijal signál. Spustí sa obsluha signálov asynchrónne, ihneď po prijatí signálu, bez ohľadu na to, čo práve proces robí.

Dva signály - číslo 9 ( KILL) a 19 ( STOP) - vždy spracované systémom. Prvý z nich je potrebný na definitívne zabitie procesu (odtiaľ názov). Signál STOP pozastavuje proces: v tomto stave sa proces neodstráni z tabuľky procesov, ale nevykoná sa, kým neprijme signál 18 ( CONT) - potom bude pokračovať v práci. V príkazovom prostredí Linuxu je signál STOP môžu byť odovzdané aktívnemu procesu pomocou escape sekvencie Ctrl -Z .

Číslo signálu 15 ( TERMÍN) slúži na prerušenie práce. O prerušenie(prerušenie) pracovného procesu zomrie. Úlohy sú zvyčajne prerušené únikovou sekvenciou Ctrl -C. Neexistuje spôsob, ako obnoviť prerušenú úlohu. Mali by ste si tiež uvedomiť, že niektoré programy zachytávajú signál TERMÍN(pomocou handlera), takže stlačením kombinácie klávesov Ctrl -C o) nemôže proces okamžite prerušiť. Deje sa tak preto, aby program mohol zničiť stopy svojej práce pred dokončením. V praxi sa niektoré programy týmto spôsobom prerušiť vôbec nedajú.

Presun do pozadia a zničenie pracovných miest

Začnime s jednoduchý príklad. Pozrime sa na príkaz áno, ktorý sa na prvý pohľad môže zdať zbytočný. Tento príkaz posiela nekonečný prúd reťazcov pozostávajúci zo znaku y na štandardný výstup. Pozrime sa, ako tento príkaz funguje:

/domov/larry# áno y y y y y

Postupnosť takýchto riadkov bude pokračovať donekonečna. Tento proces môžete zničiť odoslaním signálu prerušenia, t.j. stlačením Ctrl -C. Urobme teraz veci inak. Aby sa táto nekonečná sekvencia nezobrazovala na obrazovke, presmerujeme štandardný výstup príkazu yes na /dev/null . Ako možno viete, zariadenie /dev/null funguje ako „čierna diera“: všetky údaje odoslané do tohto zariadenia sa stratia. Pomocou tohto zariadenia je veľmi výhodné zbaviť sa príliš veľkého množstva výstupov z niektorých programov.

/home/larry# yes > /dev/null

Teraz sa na obrazovke nič nezobrazuje. Výzva shellu sa však tiež nevráti. Je to preto, že príkaz yes stále beží a posiela svoje správy pozostávajúce z písmen y do /dev/null . Túto úlohu môžete zničiť aj odoslaním signálu prerušenia.

Teraz povedzme, že chcete, aby príkaz yes naďalej fungoval, ale aby sa tiež vrátila výzva shellu na obrazovku, aby ste mohli pracovať s inými programami. Ak to chcete urobiť, môžete dať príkaz áno do pozadia a bude tam fungovať bez toho, aby s vami komunikoval.

Jedným zo spôsobov, ako dať proces na pozadie, je pridať & na koniec príkazu. Príklad:

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

Správa je Počet pracovných miest(číslo práce) pre proces áno. Príkazový shell priradí číslo úlohy každej úlohe, ktorú spustí. Keďže yes je jedinou vykonateľnou úlohou, je jej pridelené číslo 1. Číslo 164 je identifikačné číslo spojené s týmto procesom (PID) a toto číslo je tiež dané procesu systémom. Ako uvidíme neskôr, k procesu je možné pristupovať zadaním oboch týchto čísel.

Takže teraz máme na pozadí spustený proces yes, ktorý nepretržite posiela prúd y do zariadenia /dev/null. Ak chcete zistiť stav tohto procesu, musíte vykonať príkaz pracovných miest, čo je interný príkaz shellu.

/home/larry# práce + beh áno >/dev/null & /home/larry#

Vidíme, že tento program naozaj funguje. Ak chcete zistiť stav úlohy, môžete použiť aj príkaz ps, ako je uvedené vyššie.

Na prenos signálu do procesu (najčastejšie je to potrebné prerušiť job job) sa používa nástroj zabiť. Tomuto príkazu je pridelené buď číslo úlohy alebo PID ako argument. Voliteľným parametrom je číslo signálu, ktorý je potrebné odoslať do procesu. Štandardne je signál odoslaný TERMÍN. Vo vyššie uvedenom prípade bolo číslo úlohy 1, teda príkaz zabiť %1 preruší prácu. Keď sa k úlohe pristupuje pomocou jej čísla (a nie jej PID), potom tomuto číslu musí predchádzať symbol percenta („%“) na príkazovom riadku.

Teraz zadáme príkaz pracovných miest znova, aby ste skontrolovali výsledok predchádzajúcej akcie:

/home/larry# jobs Ukončené áno >/dev/null

V skutočnosti je úloha zničená a keď nabudúce zadáte príkaz jobs, na obrazovke o nej nebudú žiadne informácie.

Úlohu môžete zrušiť aj pomocou identifikačného čísla procesu (PID). Toto číslo spolu s identifikačným číslom úlohy sa zobrazí pri spustení úlohy. V našom príklade bola hodnota PID 164, teda príkaz zabiť 164 by bolo ekvivalentné príkazu zabiť %1. Keď používate PID ako argument príkazu kill, nemusíte zadávať znak "%".

Pozastavenie a obnovenie úloh

Najprv začnime proces s príkazom yes v popredí, ako to bolo predtým:

/home/larry# yes > /dev/null

Ako predtým, pretože proces beží v popredí, výzva shellu sa nevráti na obrazovku.

Teraz namiesto prerušenia úlohy kombináciou klávesov Ctrl -C, úloha je možná pozastaviť(suspend, doslova - pozastaviť), vysielajúc mu signál STOP. Ak chcete úlohu pozastaviť, musíte stlačiť príslušnú kombináciu kláves, zvyčajne túto Ctrl -Z .

/home/larry# yes > /dev/null Ctrl -Z+ Zastavené áno >/dev/null /home/larry#

Pozastavený proces sa jednoducho nevykoná. Nespotrebúva zdroje procesora. Pozastavená úloha môže byť spustená z rovnakého bodu, ako keby nebola pozastavená.

Ak chcete pokračovať v úlohe spustenej v popredí, môžete použiť príkaz fg(od slova popredie – popredie).

/home/larry# fg áno >/dev/null

Príkazový shell opäť zobrazí názov príkazu, aby používateľ vedel, v ktorej úlohe sa nachádza. tento moment spustený v popredí. Túto úlohu znova pozastavme stlačením klávesov Ctrl -Z, ale tentoraz ho spustíme na pozadí príkazom bg(od slova pozadie - pozadie). To spôsobí, že proces beží, ako keby bol spustený pomocou príkazu s & na konci (ako to bolo urobené v predchádzajúcej časti):

/home/larry# bg + áno $>$/dev/null & /home/larry#

Výzva shellu sa vráti. Teraz tím pracovných miest musí ukázať, že proces Áno momentálne skutočne pracuje; tento proces môže byť zabitý príkazom zabiť, ako sa to robilo predtým.

Na pozastavenie úlohy spustenej na pozadí nemôžete použiť klávesovú skratku Ctrl -Z. Pred pozastavením úlohy ju treba dostať do popredia príkazom fg a až potom prestať. Teda príkaz fg možno použiť buď na pozastavené úlohy, alebo na úlohu spustenú na pozadí.

Medzi úlohami na pozadí a pozastavenými úlohami je veľký rozdiel. Pozastavená úloha nefunguje - nevynakladajú sa na ňu žiadne peniaze výpočtový výkon procesor. Táto úloha nevykonáva žiadnu akciu. Pozastavená úloha zaberá určité množstvo pamäte RAM počítača; po určitom čase jadro prečerpá túto časť pamäte HDD « poste restante" Na rozdiel od toho je spustená úloha na pozadí, ktorá využíva pamäť a robí niektoré veci, ktoré by ste mohli chcieť urobiť, ale zároveň môžete pracovať na iných programoch.

Úlohy spustené na pozadí sa môžu pokúsiť zobraziť nejaký text na obrazovke. To bude prekážať pri práci na iných úlohách.

/home/larry# áno &

Tu štandardný výstup nebol presmerovaný na zariadenie /dev/null, takže na obrazovku sa vytlačí nekonečný prúd y znakov. Toto vlákno nemožno zastaviť kvôli kombinácii klávesov Ctrl -C neovplyvňuje úlohy na pozadí. Ak chcete zastaviť tento výstup, musíte použiť príkaz fg, čím sa úloha dostane do popredia a následne sa úloha zničí kombináciou klávesov Ctrl -C .

Urobme ešte jednu poznámku. Zvyčajne podľa tímu fg a tím bg ovplyvniť tie úlohy, ktoré boli naposledy pozastavené (ak zadáte príkaz, tieto úlohy budú označené symbolom + vedľa čísla úlohy pracovných miest). Ak je súčasne spustená jedna alebo viac úloh, úlohy možno umiestniť do popredia alebo na pozadí zadaním príkazov ako argumentov fg alebo príkazy bg ich identifikačné číslo (job ID). Napríklad príkaz fg %2 umiestni úlohu číslo 2 dopredu a príkaz bg %3 dáva úlohu číslo 3 do pozadia. Použite PID ako argumenty príkazov fg A bg je zakázané.

Navyše, ak chcete dostať úlohu do popredia, môžete jednoducho zadať jej číslo. Áno, tím %2 bude ekvivalentné príkazu fg %2 .

Je dôležité si zapamätať, že funkcia riadenia úlohy patrí do shellu. Tímy fg , bg A pracovných miestinterné tímyškrupiny. Ak z nejakého dôvodu používate príkazový shell, ktorý nepodporuje funkcie správy úloh, potom v ňom tieto (a podobné) príkazy nenájdete.

Správa servera so systémom Linux je často sprevádzaná viacerými manipuláciami s príkazmi v okne terminálu. Toto je známy obrázok pre tých, ktorí spravujú servery v systéme Linux, av niektorých prípadoch je vhodné spúšťať príkazy na pozadí. Toto sa dá dobre využiť v praxi a stojí za to uviesť dôvody, prečo by to mohlo byť užitočné:
— Keď je terminál preťažený množstvom správ a nie je možné paralelne vykonávať ďalšie akcie;
— Ak zatvoríte terminál, aktuálny proces a jeho podriadené procesy sa zastavia;
Tieto problémy sa dajú vyriešiť jednoducho, jednoducho povedané, musíme úplne oddeliť bežiaci proces od riadiaceho terminálu.

V tomto príspevku sa pozrieme na užitočnú schopnosť Linuxu spúšťať príkazy na pozadí. Inými slovami, proces, ktorý spustíte, bude vykonaný oddelene od ovládacieho terminálu.

Ako spúšťať príkazy alebo procesy na pozadí
Ak váš proces beží v okne terminálu, môžete ho pozastaviť pomocou príkazu Ctrl+Z, asi to veľa ľudí vie a budú si myslieť, no a čo. A tu je to, čo je zaujímavé, keď sme proces pozastavili, môžeme v ňom pokračovať na pozadí, aby sme to urobili, musíme zadať príkaz

Po zadaní tohto príkazu bude proces pokračovať, ale na pozadí. Ak chcete zobraziť všetky procesy bežiace na pozadí, môžete zadať príkaz

Pozrime sa na jednoduchý príklad, ako sa to dá aplikovať. Povedzme, že máme , ktorý potrebujeme rozbaliť, ale nemáme čas čakať a chceme pracovať paralelne.

Rozbaľovanie archívu na pozadí

$ tar -czf home.tar.gz .

Kliknite Cntr+Z a potom zadajte príkazy

$bg$pracovných miest

Druhým spôsobom je pridať & na koniec príkazu, to povie systému, aby príkaz spustil na pozadí.

$ tar -czf home.tar.gz . &$pracovné miesta

Táto metóda umožňuje procesom bežať na pozadí, avšak STDIN, STDOUT, STDERR sú stále pripojené k terminálu. Teraz sa ubezpečme, že proces beží, aj keď je terminál zatvorený.

Vykonanie procesu po zatvorení okna terminálu
Aby proces bežal aj po zatvorení okna terminálu, môžeme použiť príkaz odmietnuť. Proces „odpojí“ od shellu okna terminálu, po ktorom bude vykonaný aj po zatvorení okna konzoly.
Pozrime sa na príklad použitia štandardného príkazu rsync, skúsme ho spustiť na pozadí a odpojiť proces od terminálu.

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

Môžete tiež použiť príkaz nohup, umožní to procesu pokračovať v behu, aj keď používateľ opustí systémové prostredie.

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

Ako oddeliť proces od ovládacieho terminálu Linuxu
Na úplné oddelenie procesu od ovládacieho terminálu môžete tiež použiť príkaz, ktorý bude účinný pri použití grafického používateľského rozhrania (GUI), napríklad prehliadača Firefox.

$ firefox/dev/null &

IN Linuxový systém(a na takmer všetkých unixových systémoch) /dev/null je špeciálny súbor zariadenia, ktorý sa tiež nazýva „nulové zariadenie“. Zápis do nej prebieha úspešne bez ohľadu na množstvo zaznamenaných informácií, čítanie z nej je ekvivalentné čítaniu konca súboru (EOF).

Minule sme hovorili o práci so vstupnými, výstupnými a chybovými prúdmi v bash skriptoch, deskriptoroch súborov a presmerovaní prúdov. Teraz už viete dosť na to, aby ste napísali niečo vlastné. V tejto fáze ovládania bash môžete mať otázky o tom, ako spravovať spustené skripty a ako automatizovať ich spúšťanie.

Doteraz sme písali názvy skriptov do príkazového riadku a stláčali Enter, čo spôsobilo okamžité spustenie programov, ale nie je to tak. jediná cesta volacie skripty. Dnes si povieme o tom, ako môže skript pracovať so signálmi Linuxu, o rôznych prístupoch k spúšťaniu skriptov a ich správe za chodu.

Linuxové signály

V Linuxe existuje viac ako tri desiatky signálov, ktoré generuje systém alebo aplikácie. Tu je zoznam tých najčastejšie používaných, ktoré sa vám pri vývoji skriptov určite budú hodiť príkazový riadok.
Kód signálu
názov
Popis
1
SIGHUP
Zatvorenie terminálu
2
SIGINT
Signál na zastavenie procesu používateľom z terminálu (CTRL + C)
3
SIGQUIT
Signál na zastavenie procesu používateľom z terminálu (CTRL + \) s výpisom pamäte
9
SIGKILL
Bezpodmienečné ukončenie procesu
15
SIGTERM
Signál požiadavky na ukončenie procesu
17
SIGSTOP
Vynútenie pozastavenia, ale nie ukončenia procesu
18
SIGTSTP
Pozastavenie procesu z terminálu (CTRL+Z), ale nie vypnutie
19
SIGCONT
Pokračujte vo vykonávaní predtým zastaveného procesu

Ak bash shell prijme signál SIGHUP, keď zatvoríte terminál, opustí sa. Pred ukončením odošle signál SIGHUP všetkým procesom, ktoré v ňom bežia, vrátane spustených skriptov.

Signál SIGINT spôsobí dočasné zastavenie prevádzky. Linuxové jadro prestane prideľovať čas procesora shellu. Keď sa to stane, shell upozorní procesy odoslaním signálu SIGINT.

Bash skripty tieto signály neovládajú, ale dokážu ich rozpoznať a vykonať určité príkazy, aby pripravili skript na následky spôsobené signálmi.

Posielanie signálov do skriptov

Bash shell vám umožňuje odosielať signály do skriptov pomocou klávesových skratiek. To je veľmi užitočné, ak potrebujete dočasne zastaviť spustený skript alebo ukončiť jeho činnosť.

Ukončenie procesu

Kombinácia klávesy CTRL+C vygeneruje signál SIGINT a odošle ho všetkým procesom bežiacim v shell, čo spôsobí ich ukončenie.

V shelli spustíme nasledujúci príkaz:

100 dolárov na spánok
Potom dokončíme jeho prácu pomocou kombinácie kláves CTRL + C.


Ukončite proces z klávesnice

Dočasné zastavenie procesu

Kombinácia kláves CTRL + Z generuje signál SIGTSTP, ktorý proces pozastaví, ale neukončí. Takýto proces zostáva v pamäti a jeho práca môže byť obnovená. Spustíme príkaz v shelli:

100 dolárov na spánok
A dočasne ho zastavte kombináciou kláves CTRL + Z.


Pozastaviť proces

Číslo v hranatých zátvorkách je číslo úlohy, ktorú shell priradí procesu. Shell zaobchádza s procesmi bežiacimi v ňom ako s úlohami s jedinečnými číslami. Prvý proces má pridelené číslo 1, druhý - 2 atď.

Ak pozastavíte úlohu viazanú na shell a pokúsite sa ju ukončiť, bash vydá varovanie.

Pozastavené úlohy môžete zobraziť pomocou nasledujúceho príkazu:

Ps-l


Zoznam úloh

V stĺpci S, ktorý zobrazuje stav procesu, sa zobrazuje T pre pozastavené procesy. To znamená, že príkaz je pozastavený alebo v stave sledovania.

Ak potrebujete ukončiť pozastavený proces, môžete použiť príkaz kill. Môžete si o tom prečítať podrobnosti.

Jej hovor vyzerá takto:

Kill processID

Zachytenie signálu

Ak chcete povoliť sledovanie signálu systému Linux v skripte, použite príkaz trap. Ak skript prijme signál zadaný pri volaní tohto príkazu, spracuje ho samostatne, zatiaľ čo shell takýto signál nespracuje.

Príkaz trap umožňuje skriptu reagovať na signály, ktoré by inak shell spracoval bez jeho zásahu.

Pozrime sa na príklad, ktorý ukazuje, ako príkaz trap špecifikuje kód, ktorý sa má vykonať, a zoznam signálov oddelených medzerami, ktoré chceme zachytiť. V tomto prípade je to len jeden signál:

#!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo Toto je testovací skript count=1, kým [ $count -le 10 ] do echo "Loop #$count" spánok 1 count=$(($ počet + 1)) hotovo
Výstup príkazu trap použitý v tomto príklade textová správa vždy, keď deteguje signál SIGINT, ktorý možno vygenerovať stlačením Ctrl + C na klávesnici.


Zachytenie signálu

Zakaždým, keď stlačíte CTRL + C, skript vykoná príkaz echo zadaný pri volaní sledovania namiesto toho, aby ho nechal ukončiť shell.

Signál ukončenia skriptu môžete zachytiť použitím názvu signálu EXIT pri volaní príkazu trap:

#!/bin/bash pasca "echo Zbohom..." EXIT count=1 kým [ $count -le 5 ] do echo "Loop #$count" spánok 1 count=$(($count + 1)) hotovo


Zachytenie signálu ukončenia skriptu

Keď sa skript ukončí, buď normálne, alebo kvôli signálu SIGINT, shell zachytí a vykoná príkaz echo.

Úprava zachytených signálov a zrušenie odpočúvania

Ak chcete upraviť signály zachytené skriptom, môžete spustiť príkaz trap s novými parametrami:

#!/bin/bash trap "echo "Ctrl-C je v pasci."" SIGINT count=1 kým [ $count -le 5 ] do echo "Loop #$count" spánok 1 count=$(($count + 1) ) hotová pasca "echo "Upravil som pascu!"" SIGINT count=1 kým [ $count -le 5 ] do echo "Druhá slučka #$count" spánok 1 count=$(($count + 1)) hotovo


Úprava zachytávania signálu

Po úprave budú signály spracované novým spôsobom.

Zachytenie signálu možno zrušiť aj jednoduchým vykonaním príkazu trap, zadaním dvojitej pomlčky a názvu signálu:

#!/bin/bash trap "echo "Ctrl-C je v pasci."" SIGINT count=1 kým [ $count -le 5 ] do echo "Loop #$count" spánok 1 count=$(($count + 1) ) hotová pasca -- SIGINT echo "Práve som odstránil pascu" počet=1, zatiaľ čo [ $count -le 5 ] do echo "Druhá slučka #$count" spánok 1 počet=$(($count + 1)) hotovo
Ak skript prijme signál pred zrušením odpočúvania, spracuje ho tak, ako je uvedené v súčasný tím pasca. Spustíme skript:

$ ./myscript
A stlačte CTRL + C na klávesnici.


Signál zachytený pred odpočúvaním bol zrušený.

K prvému stlačeniu CTRL + C došlo v čase vykonávania skriptu, keď prebiehalo zachytenie signálu, takže skript vykonal príkaz echo priradený k signálu. Po vykonaní príkazu unhook fungoval príkaz CTRL + C ako zvyčajne a skript sa ukončil.

Spúšťanie skriptov príkazového riadku na pozadí

Niekedy bash skriptom trvá dlho, kým dokončia úlohu. Možno však budete musieť byť schopní normálne pracovať na príkazovom riadku bez čakania na dokončenie skriptu. Nie je to také ťažké implementovať.

Ak ste videli zoznam výstupov procesov príkazom ps, možno ste si všimli procesy, ktoré bežia na pozadí a nie sú viazané na terminál.
Napíšeme nasledujúci skript:

#!/bin/bash count=1 while [ $count -le 10 ] do spánku 1 count=$(($count + 1)) hotovo
Spustite to zadaním znaku ampersand (&) za názvom:

$ ./myscript &
To spôsobí, že sa spustí ako proces na pozadí.


Spustenie skriptu na pozadí

Skript sa spustí v procese na pozadí, jeho identifikátor sa zobrazí v termináli a po dokončení jeho vykonania sa vám zobrazí správa.

Všimnite si, že hoci skript beží na pozadí, naďalej používa terminál na výstup správ do STDOUT a STDERR, čo znamená, že text, ktorý vypíše alebo chybové správy, budú viditeľné v termináli.


Zoznam procesov

Pri tomto prístupe, ak ukončíte terminál, ukončí sa aj skript spustený na pozadí.

Čo ak chcete, aby skript pokračoval v behu po zatvorení terminálu?

Vykonávanie skriptov, ktoré sa neskončia pri zatváraní terminálu

Skripty je možné spúšťať v procesoch na pozadí aj po ukončení relácie terminálu. Ak to chcete urobiť, môžete použiť príkaz nohup. Tento príkaz vám umožňuje spustiť program blokovaním signálov SIGHUP odosielaných do procesu. Výsledkom je, že proces sa vykoná, aj keď opustíte terminál, v ktorom bol spustený.

Použime túto techniku ​​pri spustení nášho skriptu:

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


Tím nohup

Príkaz nohup odpojí proces z terminálu. To znamená, že proces stratí odkazy na STDOUT a STDERR. Aby sa nestratili údaje o výstupe skriptu, nohup automaticky presmeruje správy prichádzajúce do STDOUT a STDERR do súboru nohup.out.

Všimnite si, že ak spustíte viacero skriptov z rovnakého adresára, ich výstup skončí v jedinom súbore nohup.out.

Zobraziť úlohy

Príkaz jobs vám umožňuje zobraziť aktuálne úlohy, ktoré sú spustené v shelli. Napíšeme nasledujúci skript:

#!/bin/bash count=1 while [ $count -le 10 ] do echo "Slučka #$count" spánok 10 count=$(($count + 1)) hotovo
Poďme to spustiť:

$ ./myscript
A dočasne ho zastavte kombináciou kláves CTRL + Z.


Spustenie a pozastavenie skriptu

Spustite ten istý skript na pozadí, pričom výstup skriptu presmerujeme do súboru tak, aby sa na obrazovke nič nezobrazovalo:

$ ./myscript > výstupný súbor &
Po vykonaní príkazu jobs uvidíme informácie o pozastavenom skripte aj o skripte spustenom na pozadí.


Získavanie informácií o skriptoch

Prepínač -l pri volaní príkazu jobs indikuje, že potrebujeme informácie o ID procesov.

Reštartovanie pozastavených úloh

Na reštartovanie skriptu na pozadí môžete použiť príkaz bg.

Spustíme skript:

$ ./myscript
Stlačte CTRL + Z, čím sa jeho vykonávanie dočasne zastaví. Spustíme nasledujúci príkaz:

$ bg


príkaz bg

Skript teraz beží na pozadí.

Ak máte viacero pozastavených úloh, môžete zadať číslo úlohy príkazu bg a reštartovať konkrétnu úlohu.

Ak chcete reštartovať úlohu v normálny režim použite príkaz fg:

Plánovanie spúšťania skriptov

Linux poskytuje niekoľko spôsobov, ako spustiť bash skripty v danom čase. Sú to príkazy at a plánovač úloh cron.

Príkaz at vyzerá takto:

V čase [-f názov súboru]
Tento príkaz rozpoznáva mnoho formátov času.

  • Štandardné, označujúce hodiny a minúty, napríklad - 10:15.
  • Pomocou indikátorov AM/PM, pred alebo po poludní, napríklad - 22:15.
  • Používanie špeciálnych mien ako teraz, poludnie, polnoc.
Okrem možnosti určiť čas, kedy by sa mala úloha spustiť, príkazu at možno zadať aj dátum pomocou jedného z podporovaných formátov.
  • Štandardný formát dátumu, v ktorom sa dátum zapisuje pomocou vzorov MMDDYY, MM/DD/RR alebo DD.MM.RR.
  • Textové znázornenie dátumu, napríklad 4. júl alebo 25. december, pričom je možné určiť rok alebo sa bez neho zaobísť.
  • Nahrávanie ako teraz + 25 minút .
  • Pohľad na záznam zajtra o 22:15 .
  • Typ záznamu 10:15 + 7 dní.
Nezachádzajme hlbšie do tejto témy, pozrime sa na jednoduchý prípad použitia príkazu:

$ na -f ./myscript teraz


Plánovanie úloh pomocou príkazu at

Prepínač -M pri volaní na sa používa na odoslanie toho, čo skript vypíše e-mail, ak je systém zodpovedajúcim spôsobom nakonfigurovaný. Ak odošlete email nie je možné, tento spínač jednoducho potlačí výstup.

Ak chcete zobraziť zoznam úloh čakajúcich na vykonanie, môžete použiť príkaz atq:


Zoznam čakajúcich úloh

Odstraňujú sa čakajúce úlohy

Príkaz atrm vám umožňuje vymazať čakajúcu úlohu. Pri volaní uveďte číslo úlohy:

$atrm 18


Odstránenie úlohy

Spúšťajte skripty podľa plánu

Naplánovanie spustenia vašich skriptov raz pomocou príkazu at vám môže v mnohých situáciách uľahčiť život. Čo ak však potrebujete, aby bol skript spustený v rovnakom čase každý deň, raz za týždeň alebo raz za mesiac?

Linux má nástroj crontab, ktorý vám umožňuje naplánovať skripty, ktoré je potrebné pravidelne spúšťať.

Crontab beží na pozadí a na základe údajov v takzvaných cron tabuľkách spúšťa naplánované úlohy.

Ak chcete zobraziť existujúcu tabuľku úloh cron, použite nasledujúci príkaz:

$ crontab –l
Keď plánujete spustenie skriptu podľa plánu, crontab akceptuje údaje o tom, kedy je potrebné vykonať úlohu, v nasledujúcom formáte:

Minúta, hodina, deň v mesiaci, mesiac, deň v týždni.
Napríklad, ak chcete, aby sa určitý skript s názvom príkaz spustil každý deň o 10:30, bude to zodpovedať nasledujúcemu záznamu v tabuľke úloh:

30 10 * * * príkaz
Zástupný znak „*“ použitý pre polia dňa v mesiaci, mesiaci a dni v týždni znamená, že cron by mal príkaz spustiť každý deň v mesiaci o 10:30.

Ak napríklad chcete, aby sa skript spúšťal každý pondelok o 16:30, budete musieť vytvoriť nasledujúcu položku v tabuľke úloh:

30 16 * * 1 príkaz
Číslovanie dní v týždni začína od 0, 0 znamená nedeľu, 6 znamená sobotu. Tu je ďalší príklad. Tu sa príkaz vykoná o 12:00 v prvý deň každého mesiaca.

00 12 1 * * príkaz
Mesiace sa počítajú od 1.
Ak chcete pridať položku do tabuľky, musíte zavolať crontab pomocou prepínača -e:

Crontab –e
Potom môžete zadať príkazy generovania plánu:

30 10 * * * /home/likegeeks/Desktop/myscript
Vďaka tomuto príkazu bude skript vyvolávaný každý deň o 10:30. Ak narazíte na chybu „Prostriedok dočasne nedostupný“, spustite príkaz uvedený nižšie ako root:

$ rm -f /var/run/crond.pid
Pravidelné spúšťanie skriptov pomocou cronu môžete organizovať ešte jednoduchšie pomocou niekoľkých špeciálnych adresárov:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Umiestnenie súboru skriptu do jedného z nich spôsobí, že sa bude spúšťať každú hodinu, denne, týždenne alebo mesačne.

Spustite skripty pri prihlásení a spustení shellu

Môžete automatizovať spúšťanie skriptov na základe rôznych udalostí, ako je prihlásenie používateľa alebo spustenie shellu. Môžete si prečítať o súboroch, ktoré sa spracúvajú v takýchto situáciách. Ide napríklad o nasledujúce súbory:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Ak chcete spustiť skript pri prihlásení, umiestnite jeho volanie do súboru .bash_profile.

A čo spúšťanie skriptov pri otvorení terminálu? Súbor .bashrc vám to pomôže zorganizovať.

Výsledky

Dnes sme diskutovali o otázkach týkajúcich sa manažmentu životný cyklus skripty, hovorili sme o tom, ako spúšťať skripty na pozadí, ako naplánovať ich vykonávanie. Nabudúce si prečítajte o funkciách v bash skriptoch a vývoji knižníc.

Vážení čitatelia! Používate nástroje na plánovanie spúšťania skriptov príkazového riadka podľa plánu? Ak áno, povedzte nám o nich.

Terminálová služba Linuxu štandardne beží v režime jednej úlohy. To znamená, že akákoľvek spustená posádka blokuje terminál, kým nie je dokončený. Tento prístup nie je vhodný pri spúšťaní programov, ktoré vyžadujú dlhý čas vykonávania. Tento problém možno vyriešiť dvoma spôsobmi: otvoriť ďalšie okno terminálu a vykonať v ňom ďalší príkaz alebo použiť režim na pozadí. Všetky súčasné operačné systémy vrátane Linuxu sú multitaskingové, čo znamená schopnosť súčasne spúšťať viacero programov.

Ako môžem spustiť brigádu na pozadí, aby som mal okamžitý prístup k rozhraniu príkazového riadku? Posádka, ktorá bola nútená bežať, sa nazýva proces na pozadí. Procesy na pozadí sa nezobrazujú na obrazovke. Napríklad server Apache HTTPD beží na pozadí na obsluhu webových stránok. Skript shellu alebo akýkoľvek príkaz môžete prepnúť do režimu nízkej priority. Úlohu (napríklad skupinu alebo skript) je možné presunúť do pozadia pridaním znaku „&“ na koniec príkazového riadku. Tento príkaz presunie príkaz do pozadia a uvoľní miesto v termináli. Tím, ktorý beží na pozadí, sa nazýva úloha. Kým je spustený príkaz na pozadí, je možné vykonávať akékoľvek iné príkazy. Syntax je nasledovná:

príkaz & názov-skriptu & /cesta/k/príkazu arg1 arg2 & príkaz-1 | príkaz-2 arg1 & príkaz-1 | príkaz-2 -arg1 -arg2 >/cesta/k/výstupu &

Ak chcete spustiť programy na pozadí bez blokovania okna terminálu, musíte použiť špeciálneho inštruktora „&“. Po zadaní názvu príkazu, možností a vstupných parametrov umiestnite tento znak na úplný koniec riadku. IN všeobecný pohľad túto sekvenciu možno zadať ako „názov_príkazu -možnosť vstupný_parameter &“.

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

Po stlačení tlačidla Enter sa program automaticky spustí na pozadí. V tomto prípade terminál zobrazí riadok s nasledujúcim obsahom „[číslo_úlohy] identifikátor_procesu“ a vyzve vás na zadanie novo vytvoreného príkazu.

Nájdite príkazy spustené na pozadí v systéme Linux

Spustite nasledujúci príkaz:

Príklad výstupu údajov:

Spustenie find / -name "*.c" 2> /dev/null > /tmp/output.txt &
+ Spustenie grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Kde sú identifikátory objednávky.

Ak chcete zobraziť ID procesov pre ID úloh okrem štandardných pretypov, prejdite voľbou -l:

Príklad výstupu údajov:

7307 Spustenie find / -name "*.c" 2> /dev/null > /tmp/output.txt &
+ 7324 Spustenie grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Ak chcete zobraziť iba ID procesov, zadajte:

Príklad výstupu údajov:

Zastavte vykonávanie príkazov spustených na pozadí

Ak chcete násilne alebo elegantne ukončiť proces, použite príkaz kill. Syntax je nasledovná:

zabiť PID
zabiť -15 PID
zabiť -9 PID
killall process-Name-Here
killall -15 proces-meno-tu
killall -9 process-Name-Here

Návrat programu do režimu popredia v systéme Linux

Linux vám umožňuje nielen spúšťať programy na pozadí, ale v prípade potreby ich aj vrátiť k normálnemu vykonávaniu. Na to existujú dva nástroje: príkaz ( Tím je skupina ľudí, ktorých spájajú spoločné motívy a záujmy.) fg a operátor %. Princíp ich snaženia je mimoriadne jednoduchý. fg vyžaduje zadanie čísla úlohy ako parametra a musí sa nahradiť za % bezprostredne za operátorom bez medzier.

nájsť / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: úloha ukončená
+ Koniec 1 nájdi / -name .ini 2> ~/results.txt

Operačný systém sa v podstate skladá z jadra a obrovskej sady programov, ktoré sú navrhnuté tak, aby vykonávali rôzne úlohy, udržiavali systém a spĺňali potreby používateľa. Takmer všetka interakcia medzi používateľom a operačným systémom prebieha prostredníctvom programov. Preto je dôležité, aby začiatočníci pochopili, ako spustiť program v systéme Linux, čo sa deje počas spúšťania a aké sú spôsoby spúšťania.

Predtým, ako prejdeme k spúšťaniu programov, musíme najprv pochopiť, čo je program. V Linuxe sa programy líšia od ostatných súborov iba tým, že majú nastavený spustiteľný príznak. O tom som už podrobne písal v článku, takže to nebudem opakovať.

Všetky programy možno rozdeliť do niekoľkých typov:

  • Binárne programy- obsahujú inštrukcie pre procesor, ktoré sú pripravené na vykonanie, väčšina programov je v tomto formáte, sú rýchle a systém ich vykonáva okamžite;
  • Bytecode programy- už to nie sú inštrukcie procesora, ale inštrukcie konkrétneho virtuálneho stroja, ktorý ich môže vykonávať, bez virtuálneho stroja nie je možné takéto príkazy vykonať. Takéto programy spotrebúvajú viac zdrojov, ale sú aj dosť rýchle, ich výhodou je, že sa dajú spustiť bez úprav kdekoľvek, kde môžu fungovať virtuálny prístroj. Medzi takéto programy patria programy Java.
  • Skriptovacie programy- tieto programy pozostávajú zo sady príkazov v obyčajnom texte, ktoré sú vykonávané špeciálnym tlmočníkom. Takéto programy sú pomalšie, ale ľahšie sa vyvíjajú a ich kód sa dá ľahko a rýchlo zmeniť.

Teraz prejdime k spúšťaniu programov.

Spustenie programov v termináli

Spočiatku na operačných sálach Unixové systémy a Linux nemal grafické rozhranie, takže programy sa spúšťali pomocou príkazov z terminálu. Teraz je to tiež možné a skúsení používatelia to celkom aktívne využívajú. Syntax spustenia programu vyzerá takto:

/cesta/k/suboru/programu možnosti

Parametre sa zadávajú iba vtedy, keď sú potrebné, ale shell musí vždy poznať úplnú cestu k programu. Všetko za názvom programu a medzerou sú parametre. Pravdepodobne ste si už všimli, že pri spúšťaní programov zvyčajne neuvádzame úplnú cestu. Bolo by to veľmi dlhé a nepohodlné.

Vývojári prišli s riešením. Bola vytvorená premenná PATH, ktorá ukladá všetky cesty k priečinkom, kde sa zvyčajne nachádzajú programy – /bin, /sbin, /usr/bin, /usr/sbin atď. Jeho obsah môžete zobraziť príkazom:

Keď zadáte názov programu, systém vyhľadá spustiteľný súbor s týmto názvom vo všetkých priečinkoch z PATH a ak ho nájde, spustí ho. Ak takýto súbor neexistuje, zobrazí sa správa „príkaz nenájdený“. Ak teda chcete spustiť niektorý zo systémových programov, stačí zadať jeho názov spustiteľný súbor, Napríklad:

A po medzere môžete zadať parametre:

Ak sa program nenachádza v týchto adresároch, musíte k nemu zadať úplnú cestu:

/usr/local/bin/ls1

Ak chcete spustiť program cez terminál ubuntu, ktorý sa nachádza v aktuálnom priečinku, potom bude situácia mierne odlišná. Systém prehľadáva iba priečinky v premennej PATH, neprehľadáva aktuálny adresár. Ak teda zadáte názov spustiteľného súboru, zobrazí sa chyba. Musíte zadať úplnú cestu, ako si pamätáte, že bude./:

Niekedy je potrebné preniesť nejaké špeciálne . Napríklad premenná EDITOR označuje ktorý textový editor by mal byť použitý ako predvolený. Pred názvom príkazu môžete zadať názov premennej a jej hodnotu pomocou syntaxe:

názov_premennej = príkaz hodnoty

Napríklad:

EDITOR=nano video

V predvolenom nastavení tento príkaz otvorí nastavenia v editore Vim, ale s týmto premenná prostredia nastavenia sa otvoria v nano editore.

Spúšťanie programov ako iný používateľ

Už viete, ako spustiť program linuxový terminál, a čo ostatní používatelia? Vo Windowse je celkom bežné spúšťať programy ako správca, aby program mohol získať viac prístupových práv v systéme. Na Linuxe sa na to používa utilita sudo. Jej meno možno dešifrovať ako sčarodejnica u ser robiť- zmeniť používateľa a spustiť. V predvolenom nastavení nástroj spúšťa príkaz ako superužívateľ root:

príkaz sudo
sudo whoami

Ale pomocou voľby -u môžete program spustiť ako ktorýkoľvek používateľ prihlásený do systému:

príkaz sudo -u užívateľské meno
sudo -u postgres whoami

Príkaz whoami (kto som) zobrazuje meno aktuálneho používateľa.

Ako spustiť program na pozadí

Niekedy je potrebné spustiť v termináli dlho bežiaci program, aby neprekážal pri ďalšej práci. Ak to chcete urobiť, môžete použiť spustenie programu na pozadí v systéme Linux:

názov_programu &

Napríklad:

dd if=/dev/zero of=~/počet súborov=100000 &

Systém vypíše PID, jedinečný identifikátor programu, ktorý potom môžete použiť na zatvorenie:

Ako spustiť skript v systéme Linux

Už sme si povedali, že programy sa delia na binárne a interpretované. Predtým sme hovorili len o binárnych programoch. Na spustenie interpretovaných programov potrebujete priamo tlmočníka, medzi takéto programy patria programy napísané v jazykoch ako Java, Python, Perl, Ruby, PHP, NodeJS a mnoho ďalších. Syntax na spustenie takéhoto programu je odlišná:

tlmočník /cesta/k/suboru/programu možnosti

Rôzni tlmočníci sa správajú odlišne, preto je lepšie okamžite zadať úplnú cestu k programu. Python zvyčajne preberá skripty z aktuálneho priečinka bez zadania úplnej cesty:

python hellowrld.py

A programy Java je potrebné spustiť takto:

java -jar program.jar

Pre interpretované programové súbory je príznak spustiteľnosti voliteľný, pretože sa odovzdávajú ako parameter hlavnému programu. Výnimkou sú iba Bash skripty. Skript môžete spustiť pomocou tlmočníka:

Alebo jednoducho zadajte cestu k skriptu:

Samotný shell určuje svoje skripty pomocou príznaku spustiteľnosti a vykoná ich. Ak príznak spustiteľnosti nie je nastavený, mali by ste ho pridať:

sudo chmod u+x ./script.sh

Preto boli pre väčšinu interpretovaných programov vytvorené jednoduché sh skripty, ktoré sa dajú rýchlo spustiť.

Spustenie linuxových programov v GUI

Oveľa pohodlnejšie je spúšťať programy cez grafické rozhranie. Ak nie je možné spustiť konzolové programy týmto spôsobom, potom existujú skratky pre všetky grafické nástroje, ktoré nájdete v hlavnom menu systému:

Prípadne môžete program spustiť z Správca súborov, dvojitým kliknutím myši, ale potom je potrebné nastaviť príznak spustiteľnosti.

Spúšťanie skriptov grafické rozhranie. Všetky skratky menu nájdete v adresári /usr/share/applications/. Každý program je možné spustiť dvojitým kliknutím odtiaľto. Pozrime sa však, čo je vo vnútri skratky; ak to chcete urobiť, otvorte ju v textovom editore:


Riadok Exec okrem iného špecifikuje príkaz, ktorý sa spustí linuxové programy keď dvakrát kliknete na skratku. Môžete si vziať jednu z existujúcich skratiek a vytvoriť si vlastnú na jej základe. Toto je jednoducho názov programu. Je však dôležité poznamenať, že je lepšie zadať úplnú cestu na miestach, ako sú skratky, skripty, cron atď., Tým sa zníži počet chýb, pretože nemôžete vedieť, či systém v tomto prípade kontroluje PATH alebo hľadať program iba v aktuálnom adresári. Teraz viete všetko o tom, ako spustiť program v systéme Linux.

závery

V tomto článku sme sa pozreli na to, ako spustiť program cez terminál ubuntu alebo v inom Linuxové distribúcie. Aj keď sa to zdá ako veľmi jednoduchá téma, existuje niekoľko zaujímavých bodov, ktoré môžu byť užitočné. Ale už o nich viete. Ak máte nejaké otázky, opýtajte sa v komentároch!