Ukaz za zagon v ozadju Linuxa. Kako zagnati program v Linuxu. Brisanje čakajočih opravil

Naloge in procesi

Pokliče se kateri koli program, ki se izvaja v sistemu Linux postopek. Za Linux kot večopravilni sistem je značilno, da se lahko hkrati izvaja veliko procesov, ki pripadajo enemu ali več uporabnikom. Z ukazom lahko prikažete seznam procesov, ki se trenutno izvajajo ps, na primer kot sledi:

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

Upoštevajte, da je ukaz privzeto ps prikaže seznam samo tistih procesov, ki pripadajo uporabniku, ki ga je zagnal. Za ogled vseh procesov, ki se izvajajo v sistemu, morate izdati ukaz ps -a . Procesne številke(ID procesa ali PID), navedene v prvem stolpcu, so edinstvene številke, ki jih sistem dodeli vsakemu delujočemu procesu. Zadnji stolpec z naslovom COMMAND označuje ime ukaza, ki se izvaja. V tem primeru seznam vsebuje procese, ki jih je zagnal uporabnik larry sam. V sistemu potekajo številni drugi procesi, oni celoten seznam si lahko ogledate z ukazom ps-pom. Vendar sta med ukazi, ki jih izvaja uporabnik larry, samo bash (ukazna lupina za uporabnika larry) in sam ukaz ps. Lupino bash lahko vidite, da se izvaja sočasno z ukazom ps. Ko je uporabnik vnesel ukaz ps, lupina bash ga je začela izvajati. Po ekipi ps je končal svoje delo (prikaže se tabela procesov), se nadzor vrne k procesu bash. Nato lupina bash prikaže poziv in počaka na nov ukaz.

Imenuje se tudi tekoči proces naloga(služba). Izraza proces in naloga se uporabljata izmenično. Vendar se običajno postopek imenuje naloga, ko to pomeni vodenje delovnih mest(kontrola dela). Nadzor opravil je funkcija ukazne lupine, ki uporabniku omogoča preklapljanje med več opravili.

V večini primerov bodo uporabniki zagnali samo eno nalogo – to bo zadnji ukaz, ki so ga vnesli v ukazno lupino. Vendar imajo številne lupine (vključno z bash in tcsh) funkcije vodenje delovnih mest(job control), ki omogoča izvajanje več ukazov hkrati oz naloge(poslovi) in po potrebi preklapljate med njimi.

Upravljanje opravil je lahko koristno, če na primer urejate velik besedilna datoteka in želite začasno prekiniti urejanje, da izvedete kakšno drugo operacijo. S funkcijami za upravljanje opravil lahko začasno zapustite urejevalnik, se vrnete na ukazno lupino in izvedete druga dejanja. Ko so končani, se lahko vrnete nazaj k delu z urejevalnikom in ga najdete v istem stanju, v katerem je bil ostal. Obstaja veliko več uporabnih uporab za funkcije upravljanja opravil.

Način ospredja in ozadja

Naloge so lahko bodisi ospredje(v ospredju), oz ozadje(ozadje). V danem trenutku je lahko samo ena naloga v ospredju. Naloga v ospredju je naloga, s katero ste v interakciji; sprejema vnos s tipkovnice in pošilja izhod na zaslon (če seveda niste vnosa ali izhoda preusmerili kam drugam). proti, opravila v ozadju ne prejemajo vnosa s terminala; Običajno takšna delovna mesta ne zahtevajo interakcije uporabnika.

Nekatere naloge se dokončajo zelo dolgo in med izvajanjem se ne zgodi nič zanimivega. Primer takšnih nalog je prevajanje programov in stiskanje velikih datotek. Nobenega razloga ni, da bi strmeli v zaslon in čakali, da se te naloge dokončajo. Takšna delovna mesta je treba izvajati ozadje. V tem času lahko delate z drugimi programi.

Za nadzor izvajanja procesov v Linuxu je na voljo mehanizem prenosa signali. Signal je zmožnost procesov, da izmenjujejo standardna kratka sporočila neposredno s pomočjo sistema. Signalno sporočilo ne vsebuje nobenih informacij, razen številke signala (zaradi udobja se lahko namesto številke uporabi ime, ki ga vnaprej določi sistem). Za prenos signala mora proces uporabiti le sistemski klic ubiti(), in za sprejem signala ne potrebujete ničesar. Če se mora proces odzvati na signal na nek poseben način, se lahko registrira vodja, in če ni upravljavca, se bo sistem odzval na to. Običajno to povzroči, da se proces, ki je prejel signal, takoj prekine. Zažene se upravljalnik signalov asinhrono, takoj po prejemu signala, ne glede na to, kaj proces v tem trenutku počne.

Dva signala - številka 9 ( UBIJAJ) in 19 ( STOP) - vedno obdela sistem. Prvi od njih je potreben, da se proces zagotovo ubije (od tod tudi ime). Signal STOP prekine proces: v tem stanju proces ni odstranjen iz tabele procesov, vendar se ne izvede, dokler ne prejme signala 18 ( NADALJ) - po katerem bo deloval še naprej. V ukazni lupini Linuxa signal STOP se lahko posreduje aktivnemu procesu z uporabo ubežnega zaporedja Ctrl -Z .

Signalna številka 15 ( TERMIN) služi za prekinitev dela. pri prekinitev(prekinitev) delovni proces umre. Opravila so običajno prekinjena z ubežnim zaporedjem Ctrl -C. Prekinjenega opravila ni mogoče obnoviti. Zavedati se morate tudi, da nekateri programi prestrežejo signal TERMIN(z uporabo upravljalnika), tako da pritisnete kombinacijo tipk Ctrl -C(o) ne sme takoj prekiniti postopka. To se naredi zato, da lahko program uniči sledi svojega dela, preden se zaključi. V praksi nekaterih programov na ta način sploh ni mogoče prekiniti.

Premeščanje v ozadje in uničevanje delovnih mest

Začnimo z preprost primer. Poglejmo ukaz yes, ki se na prvi pogled morda zdi neuporaben. Ta ukaz pošlje neskončen tok nizov, sestavljenih iz znaka y, v standardni izhod. Poglejmo, kako deluje ta ukaz:

/home/larry# da y y y y y

Zaporedje takšnih vrstic se bo nadaljevalo v nedogled. Ta proces lahko uničite tako, da mu pošljete prekinitveni signal, to je s pritiskom Ctrl -C. Naredimo zdaj stvari drugače. Da preprečimo prikaz tega neskončnega zaporedja na zaslonu, bomo standardni izhod ukaza yes preusmerili v /dev/null. Kot morda veste, naprava /dev/null deluje kot "črna luknja": vsi podatki, poslani tej napravi, so izgubljeni. Z uporabo te naprave je zelo priročno, da se znebite preveč izpisa nekaterih programov.

/home/larry# da > /dev/null

Zdaj se na zaslonu ne prikaže nič. Vendar pa tudi ukazna lupina ni vrnjena. To je zato, ker se ukaz yes še vedno izvaja in pošilja svoja sporočila, sestavljena iz črk y, v /dev/null. To nalogo lahko tudi uničite tako, da ji pošljete prekinitveni signal.

Zdaj pa recimo, da želite, da ukaz yes še naprej deluje, a tudi vrne lupinski poziv na zaslon, da lahko delate z drugimi programi. Če želite to narediti, lahko postavite ukaz yes v ozadje in tam bo deloval brez komunikacije z vami.

Eden od načinov, kako proces postaviti v ozadje, je, da na konec ukaza dodate &. primer:

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

Sporočilo je delovna številka(številka delovnega mesta) za postopek da. Ukazna lupina dodeli številko opravila vsakemu opravilu, ki ga izvaja. Ker je yes edino izvršljivo opravilo, mu je dodeljena številka 1. Številka 164 je identifikacijska številka, povezana s tem procesom (PID), in to številko procesu dodeli tudi sistem. Kot bomo videli pozneje, lahko do procesa dostopate tako, da navedete obe številki.

Zdaj imamo proces yes, ki teče v ozadju in nenehno pošilja tok y-jev v napravo /dev/null. Če želite izvedeti status tega procesa, morate izvesti ukaz službe, ki je notranji ukaz lupine.

/home/larry# opravila + Teče da >/dev/null & /home/larry#

Vidimo, da ta program res deluje. Če želite izvedeti status opravila, lahko uporabite tudi ukaz ps, kot je prikazano zgoraj.

Za prenos signala procesu (najpogosteje obstaja potreba prekiniti delo delo) se uporablja pripomoček ubiti. Ta ukaz ima kot argument številko opravila ali PID. Izbirni parameter je številka signala, ki ga je treba poslati procesu. Privzeto je signal poslan TERMIN. V zgornjem primeru je bila številka opravila 1, zato ukaz ubij %1 bo prekinil delo. Ko se do opravila dostopa po njegovi številki (in ne po njegovem PID), mora biti pred to številko v ukazni vrstici simbol za odstotek (»%«).

Zdaj pa vnesite ukaz službe znova, da preverite rezultat prejšnjega dejanja:

/home/larry# jobs Končano da >/dev/null

Pravzaprav je opravilo uničeno in ob naslednjem vnosu ukaza jobs na zaslonu ne bo nobenih informacij o tem.

Opravilo lahko prekinete tudi z identifikacijsko številko procesa (PID). Ta številka je skupaj z identifikacijsko številko opravila navedena, ko se opravilo začne. V našem primeru je bila vrednost PID 164, zato ukaz ubiti 164 bi bilo enakovredno ukazu ubij %1. Ko uporabljate PID kot argument za ukaz kill, vam ni treba vnesti znaka "%".

Premor in nadaljevanje opravil

Najprej začnimo postopek z ukazom yes v ospredju, kot je bilo storjeno prej:

/home/larry# da > /dev/null

Kot prej se poziv lupine ne vrne na zaslon, ker se postopek izvaja v ospredju.

Zdaj namesto prekinitve opravila s kombinacijo tipk Ctrl -C, naloga je možna prekiniti(začasno zaustaviti, dobesedno - začasno ustaviti), mu poslati signal STOP. Če želite začasno ustaviti opravilo, morate pritisniti ustrezno kombinacijo tipk, običajno to Ctrl -Z .

/home/larry# da > /dev/null Ctrl -Z+ Ustavljeno da >/dev/null /home/larry#

Prekinjeni proces se preprosto ne izvede. Ne porablja virov procesorja. Prekinjeno opravilo se lahko začne izvajati z iste točke, kot da ne bi bilo začasno ustavljeno.

Za nadaljevanje izvajanja opravila v ospredju lahko uporabite ukaz fg(iz besede ospredje - ospredje).

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

Ukazna lupina bo ponovno prikazala ime ukaza, tako da bo uporabnik vedel, v kateri nalogi je. ta trenutek sprožil v ospredju. Ponovno zaustavimo to nalogo s pritiskom na tipke Ctrl -Z, vendar ga tokrat zaženemo v ozadje z ukazom bg(iz besede ozadje - ozadje). To bo povzročilo, da se bo postopek izvajal, kot da bi bil zagnan z ukazom z & na koncu (kot je bilo storjeno v prejšnjem razdelku):

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

Vrnjen je poziv lupine. Zdaj pa ekipa službe mora pokazati, da je proces ja trenutno dejansko dela; ta proces lahko prekinete z ukazom ubiti, kot se je to delalo prej.

Za zaustavitev opravila, ki se izvaja v ozadju, ne morete uporabiti bližnjice na tipkovnici Ctrl -Z. Preden začasno ustavite opravilo, ga morate z ukazom postaviti v ospredje fg in šele potem nehaj. Tako, ukaz fg se lahko uporabi bodisi za začasno ustavljena opravila bodisi za opravilo, ki se izvaja v ozadju.

Obstaja velika razlika med zaposlitvami v ozadju in preklicanimi zaposlitvami. Prekinjena naloga ne deluje – zanjo se ne porabi denar računalniška moč procesor. To opravilo ne izvaja nobenega dejanja. Prekinjena naloga zasede določeno količino RAM-a računalnika; čez nekaj časa bo jedro ta del pomnilnika črpalo v HDD « poste restante" Nasprotno pa se opravilo v ozadju izvaja, uporablja pomnilnik in izvaja nekatere stvari, ki bi jih morda želeli narediti, vendar morda hkrati delate na drugih programih.

Opravila, ki se izvajajo v ozadju, lahko poskušajo prikazati nekaj besedila na zaslonu. To bo motilo delo pri drugih nalogah.

/home/larry# da &

Tu standardni izhod ni bil preusmerjen na napravo /dev/null, zato bo na zaslon natisnjen neskončen tok znakov y. Te niti ni mogoče ustaviti zaradi kombinacije tipk Ctrl -C ne vpliva na opravila v ozadju. Če želite ustaviti ta izhod, morate uporabiti ukaz fg, ki bo nalogo postavil v ospredje, nato pa s kombinacijo tipk nalogo uničil Ctrl -C .

Dajmo še eno pripombo. Običajno ekipno fg in ekipa bg vpliva na tista opravila, ki so bila nazadnje začasno ustavljena (ta opravila bodo označena s simbolom + poleg številke opravila, če vnesete ukaz službe). Če se istočasno izvaja eno ali več opravil, jih lahko postavite v ospredje ali ozadje tako, da podate ukaze kot argumente fg ali ukazi bg njihovo identifikacijsko številko (job ID). Na primer ukaz fg %2 postavi opravilo številka 2 v ospredje in ukaz bg %3 postavi opravilo številka 3 v ozadje. Uporabite PID kot argumente ukaza fg in bg je prepovedano.

Še več, če želite delo postaviti v ospredje, lahko preprosto določite njegovo številko. Da, ekipa %2 bo enakovreden ukazu fg %2 .

Pomembno si je zapomniti, da funkcija nadzora dela pripada lupini. Ekipe fg , bg in službe so interne ekipeškoljke. Če iz nekega razloga uporabljate ukazno lupino, ki ne podpira funkcij upravljanja opravil, potem teh (in podobnih) ukazov v njej ne boste našli.

Upravljanje strežnika z Linuxom pogosto spremlja več manipulacij z ukazi v oknu terminala. To je znana slika za tiste, ki upravljajo strežnike v Linuxu, in v nekaterih primerih je priročno izvajati ukaze v ozadju. To se lahko uporablja v praksi in vredno je omeniti razloge, zakaj bi lahko bilo koristno:
— Ko je terminal preobremenjen s kupom sporočil in ni mogoče vzporedno izvajati dodatnih dejanj;
— Če zaprete terminal, se trenutni proces in njegovi podrejeni procesi ustavijo;
Te težave je mogoče preprosto rešiti; preprosto povedano, moramo popolnoma ločiti tekoči proces od krmilnega terminala.

V tej objavi si bomo ogledali uporabno zmožnost Linuxa za izvajanje ukazov v ozadju. Z drugimi besedami, proces, ki ga zaženete, se bo izvajal ločeno od nadzornega terminala.

Kako izvajati ukaze ali procese v ozadju
Če se vaš proces izvaja v oknu terminala, ga lahko začasno ustavite z ukazom Ctrl+Z, verjetno marsikdo to ve in si bo mislil, pa kaj. In tukaj je zanimivo, ko smo tako prekinili proces, ga lahko nadaljujemo v ozadju, za to moramo vnesti ukaz

Po vnosu tega ukaza se bo postopek nadaljeval, vendar v ozadju. Za ogled vseh procesov, ki se izvajajo v ozadju, lahko vnesete ukaz

Oglejmo si preprost primer, kako je to mogoče uporabiti. Recimo, da imamo , ki ga moramo razpakirati, vendar nimamo časa čakati in želimo delati vzporedno.

Razpakiranje arhiva v ozadju

$ tar -czf home.tar.gz .

Kliknite Cntr+Z, nato vnesite ukaze

$bg$delovna mesta

Drugi način je, da dodate & na koncu ukaza, kar bo sistemu povedalo, naj zažene ukaz v ozadju.

$ tar -czf home.tar.gz . &$delovna mesta

Ta metoda omogoča izvajanje procesov v ozadju, STDIN, STDOUT, STDERR so še vedno povezani s terminalom. Zdaj pa zagotovimo, da se postopek izvaja tudi, ko je terminal zaprt.

Izvajanje postopka po zaprtju terminalskega okna
Da bi proces deloval tudi po zaprtju okna terminala, lahko uporabimo ukaz odreči se. Proces bo "odklopil" iz lupine terminalskega okna, nato pa se bo izvedel tudi po zaprtju okna konzole.
Oglejmo si primer uporabe standardnega ukaza rsync, ga poskusimo izvesti v ozadju in odstranimo povezavo procesa s terminalom.

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

Uporabite lahko tudi ukaz nohup, bo omogočil nadaljevanje izvajanja procesa, tudi ko uporabnik zapusti sistemsko lupino.

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

Kako ločiti proces od nadzornega terminala Linux
Za popolno ločitev procesa od nadzornega terminala lahko uporabite tudi ukaz, ki bo učinkovit pri uporabi grafičnega uporabniškega vmesnika (GUI), na primer brskalnika Firefox.

$firefox/dev/null &

IN sistem Linux(in na skoraj vseh sistemih Unix) /dev/null je posebna datoteka naprave, ki ji pravimo tudi "null device". Zapisovanje vanjo poteka uspešno ne glede na količino zapisanih informacij, branje iz nje je enakovredno branju konca datoteke (EOF).

Zadnjič smo govorili o delu z vhodnimi, izhodnimi in tokovi napak v skriptih bash, deskriptorjih datotek in preusmerjanju tokov. Zdaj že veste dovolj, da napišete kaj svojega. Na tej stopnji obvladovanja bash boste morda imeli vprašanja o tem, kako upravljati izvajajoče se skripte in kako avtomatizirati njihov zagon.

Doslej smo v ukazno vrstico vnašali imena skriptov in pritiskali Enter, kar je povzročilo takojšen zagon programov, vendar temu ni tako. edina pot klicne skripte. Danes bomo govorili o tem, kako lahko skript deluje s signali Linuxa, o različnih pristopih k izvajanju skriptov in njihovem upravljanju med izvajanjem.

Linux signali

V Linuxu obstaja več kot tri ducate signalov, ki jih generirajo sistem ali aplikacije. Tukaj je seznam najpogosteje uporabljenih, ki vam bodo gotovo prišli prav pri razvoju skript ukazna vrstica.
Signalna koda
Ime
Opis
1
PRIJAVI SE
Zapiranje terminala
2
SIGINT
Signal za zaustavitev postopka s strani uporabnika s terminala (CTRL + C)
3
SIGQUIT
Signal za zaustavitev procesa uporabnika s terminala (CTRL + \) z izpisom pomnilnika
9
SIGKILL
Brezpogojna prekinitev postopka
15
SIGTERM
Signal zahteve za prekinitev procesa
17
SIGSTOP
Prisilitev, da se proces začasno prekine, vendar ne zaključi
18
SIGTSTP
Zaustavitev procesa na terminalu (CTRL+Z), vendar ne zaustavitev
19
SIGCONT
Nadaljevanje izvajanja predhodno ustavljenega procesa

Če lupina bash prejme signal SIGHUP, ko zaprete terminal, se izklopi. Pred izhodom pošlje signal SIGHUP vsem procesom, ki se v njem izvajajo, vključno s skripti, ki se izvajajo.

Signal SIGINT povzroči začasno zaustavitev delovanja. Jedro Linuxa preneha dodeljevati procesorski čas lupini. Ko se to zgodi, lupina obvesti procese tako, da jim pošlje signal SIGINT.

Bash skripti ne nadzorujejo teh signalov, vendar jih lahko prepoznajo in izvedejo določene ukaze, da pripravijo skript na posledice, ki jih povzročijo signali.

Pošiljanje signalov skriptom

Lupina bash vam omogoča pošiljanje signalov skriptom z uporabo bližnjic na tipkovnici. To je zelo priročno, če morate začasno ustaviti delujoč skript ali prekiniti njegovo delovanje.

Prekinitev postopka

Kombinacija tipke CTRL+C ustvari signal SIGINT in ga pošlje vsem procesom, ki se izvajajo v lupini, zaradi česar se prekinejo.

Zaženimo naslednji ukaz v lupini:

spi 100 $
Po tem bomo njegovo delo zaključili s kombinacijo tipk CTRL + C.


Prekinite proces s tipkovnice

Začasna ustavitev postopka

Kombinacija tipk CTRL + Z ustvari signal SIGTSTP, ki prekine proces, vendar ga ne prekine. Tak proces ostane v spominu in njegovo delo se lahko nadaljuje. Zaženimo ukaz v lupini:

spi 100 $
In ga začasno zaustavite s kombinacijo tipk CTRL + Z.


Zaustavite postopek

Številka v oglatih oklepajih je številka opravila, ki jo lupina dodeli procesu. Lupina procese, ki se izvajajo v njej, obravnava kot opravila z edinstvenimi številkami. Prvemu procesu je dodeljena številka 1, drugemu - 2 in tako naprej.

Če začasno ustavite opravilo, vezano na lupino, in ga poskusite zapreti, bo bash izdal opozorilo.

Prekinjena opravila si lahko ogledate z naslednjim ukazom:

Ps – l


Seznam opravil

V stolpcu S, ki prikazuje stanje procesa, je T prikazan za zaustavljene procese. To pomeni, da je ukaz začasno ustavljen ali v stanju sledenja.

Če morate prekiniti začasno ustavljen proces, lahko uporabite ukaz kill. Podrobnosti o tem lahko preberete.

Njen klic izgleda takole:

Ubij ID procesa

Prestrezanje signala

Če želite v skriptu omogočiti sledenje signalom Linux, uporabite ukaz trap. Če skript prejme signal, določen ob klicu tega ukaza, ga obdela neodvisno, lupina pa takega signala ne bo obdelala.

Ukaz trap omogoča, da se skript odzove na signale, ki bi jih lupina sicer obdelala brez njenega posredovanja.

Oglejmo si primer, ki prikazuje, kako ukaz trap določa kodo, ki naj se izvede, in seznam signalov, ločenih s presledki, ki jih želimo prestreči. V tem primeru je samo en signal:

#!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo To je testni skript count=1 medtem ko [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ štetje + 1)) opravljeno
Ukaz trap, uporabljen v tem primeru, daje rezultate sporočilo vsakič, ko zazna signal SIGINT, ki ga lahko ustvarite s pritiskom na Ctrl + C na tipkovnici.


Prestrezanje signala

Vsakič, ko pritisnete CTRL + C, skript izvede ukaz echo, določen pri klicu sledenja, namesto da bi lupini dovolil, da ga prekine.

Izhodni signal skripta lahko prestrežete z uporabo imena signala EXIT, ko kličete ukaz trap:

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


Prestrezanje izhodnega signala skripte

Ko se skript zapre, običajno ali zaradi signala SIGINT, bo lupina prestregla in izvedla ukaz echo.

Modifikacija prestreženih signalov in preklic prestrezanja

Če želite spremeniti signale, ki jih prestreže skript, lahko zaženete ukaz trap z novimi parametri:

#!/bin/bash trap "echo "Ctrl-C je ujet."" SIGINT count=1 medtem ko [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) done trap "echo "Spremenil sem past!"" SIGINT count=1 while [ $count -le 5 ] do echo "Druga zanka #$count" sleep 1 count=$(($count + 1)) done


Modifikacija prestrezanja signala

Po spremembi bodo signali obdelani na nov način.

Prestrezanje signala lahko tudi prekličete tako, da preprosto izvedete ukaz trap, ki mu posredujete dvojni pomišljaj in ime signala:

#!/bin/bash trap "echo "Ctrl-C je ujet."" SIGINT count=1 medtem ko [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) done trap -- SIGINT echo "Pravkar sem odstranil past" count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done
Če skript prejme signal, preden je prestrezanje preklicano, ga bo obdelal, kot je določeno v trenutna ekipa past. Zaženimo skript:

$ ./myscript
In pritisnite CTRL + C na tipkovnici.


Signal prestrežen, preden je bilo prestrezanje preklicano.

Prvi pritisk CTRL + C se je zgodil v času izvajanja skripta, ko je bilo prestrezanje signala v veljavi, tako da je skript izvedel ukaz echo, dodeljen signalu. Ko je izvajanje doseglo ukaz unhook, je ukaz CTRL + C deloval kot običajno in prekinil skript.

Izvajanje skriptov ukazne vrstice v ozadju

Včasih skripti bash potrebujejo dolgo časa, da dokončajo nalogo. Vendar pa boste morda morali normalno delati v ukazni vrstici, ne da bi čakali na dokončanje skripta. To ni tako težko izvesti.

Če ste videli seznam procesov, ki jih prikaže ukaz ps, ste morda opazili procese, ki se izvajajo v ozadju in niso vezani na terminal.
Napišimo naslednji skript:

#!/bin/bash count=1 medtem ko [ $count -le 10 ] do sleep 1 count=$(($count + 1)) done
Zaženimo ga tako, da za imenom vnesemo znak & (&):

$ ./myscipt &
To bo povzročilo, da se bo izvajal kot proces v ozadju.


Izvajanje skripta v ozadju

Skript se bo zagnal v procesu v ozadju, njegov identifikator bo prikazan v terminalu in ko bo njegovo izvajanje končano, boste videli sporočilo o tem.

Upoštevajte, da čeprav se skript izvaja v ozadju, še naprej uporablja terminal za izpis sporočil v STDOUT in STDERR, kar pomeni, da bodo besedilo, ki ga izpiše, ali sporočila o napakah vidna v terminalu.


Seznam procesov

S tem pristopom, če zapustite terminal, se bo zaprl tudi skript, ki se izvaja v ozadju.

Kaj pa, če želite, da se skript še naprej izvaja po zaprtju terminala?

Izvajanje skriptov, ki se ob zaprtju terminala ne zaprejo

Skripte je mogoče izvajati v procesih v ozadju tudi po izhodu iz terminalske seje. Če želite to narediti, lahko uporabite ukaz nohup. Ta ukaz vam omogoča zagon programa tako, da blokira signale SIGHUP, poslane procesu. Posledično se bo postopek izvedel tudi, ko zapustite terminal, v katerem je bil zagnan.

Uporabimo to tehniko pri izvajanju našega skripta:

Nohup ./myscript &
To je tisto, kar bo prikazano na terminalu.


Ekipa nohup

Ukaz nohup odveže proces od terminala. To pomeni, da bo proces izgubil reference na STDOUT in STDERR. Da ne bi izgubil podatkov, ki jih izpiše skript, nohup samodejno preusmeri sporočila, ki prispejo v STDOUT in STDERR, v datoteko nohup.out.

Upoštevajte, da če zaženete več skriptov iz istega imenika, se bo njihov rezultat končal v eni sami datoteki nohup.out.

Oglejte si naloge

Ukaz jobs vam omogoča ogled trenutnih opravil, ki se izvajajo v lupini. Napišimo naslednji skript:

#!/bin/bash count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$(($count + 1)) done
Zaženimo ga:

$ ./myscript
In ga začasno zaustavite s kombinacijo tipk CTRL + Z.


Zagon in zaustavitev skripta

Zaženimo isti skript v ozadju, medtem ko izhod skripta preusmerimo v datoteko, tako da ne prikaže ničesar na zaslonu:

$ ./myscript > outfile &
Z izvajanjem ukaza jobs bomo videli informacije o začasno ustavljenem skriptu in tistem, ki se izvaja v ozadju.


Pridobivanje informacij o skriptih

Stikalo -l pri klicu ukaza jobs nakazuje, da potrebujemo informacije o ID-jih procesov.

Ponovni zagon začasno ustavljenih opravil

Če želite znova zagnati skript v ozadju, lahko uporabite ukaz bg.

Zaženimo skript:

$ ./myscript
Pritisnite CTRL + Z, kar bo začasno ustavilo njegovo izvajanje. Zaženimo naslednji ukaz:

$bg


ukaz bg

Skript se zdaj izvaja v ozadju.

Če imate več začasno ustavljenih opravil, lahko številko opravila posredujete ukazu bg, da znova zaženete določeno opravilo.

Za ponoven začetek dela v normalen način uporabite ukaz fg:

Načrtovanje izvajanja skriptov

Linux ponuja nekaj načinov za zagon bash skriptov ob določenem času. To sta ukaz at in načrtovalec opravil cron.

Ukaz at izgleda takole:

Ob času [-f ime datoteke].
Ta ukaz prepozna veliko časovnih formatov.

  • Standard, ki označuje ure in minute, na primer - 10:15.
  • Z uporabo indikatorjev AM/PM, pred ali po poldnevu, na primer - 22:15.
  • Uporaba posebnih imen, kot so zdaj, opoldne, polnoč.
Poleg tega, da lahko podate čas, ko naj se opravilo izvaja, lahko ukazu at posredujete tudi datum z uporabo enega od podprtih formatov.
  • Standardna oblika datuma, v kateri je datum zapisan z vzorci MMDDLL, MM/DD/LL ali DD.MM.LL.
  • Besedilna predstavitev datuma, na primer 4. julij ali 25. december, medtem ko je leto mogoče določiti ali pa brez njega.
  • Snemanje kot zdaj + 25 minut .
  • Ogled posnetka jutri ob 22:15.
  • Vrsta snemanja 10:15 + 7 dni.
Ne spuščajmo se globlje v to temo, poglejmo preprost primer uporabe ukaza:

$ pri -f ./myscript zdaj


Načrtovanje opravil z uporabo ukaza at

Stikalo -M pri klicu na se uporablja za pošiljanje izhodov skripta E-naslov, če je sistem ustrezno konfiguriran. Če pošilja E-naslov ni mogoče, bo to stikalo preprosto onemogočilo izhod.

Če si želite ogledati seznam opravil, ki čakajo na izvedbo, lahko uporabite ukaz atq:


Seznam čakajočih nalog

Brisanje čakajočih opravil

Ukaz atrm omogoča brisanje čakajočega opravila. Ko ga pokličete, navedite številko naloge:

$atrm 18


Brisanje opravila

Zaženite skripte po urniku

Načrtovanje enkratnega izvajanja skriptov z uporabo ukaza at lahko olajša življenje v številnih situacijah. Kaj pa, če potrebujete, da se skript izvaja vsak dan ob istem času, enkrat na teden ali enkrat na mesec?

Linux ima pripomoček crontab, ki vam omogoča načrtovanje skriptov, ki jih je treba redno izvajati.

Crontab deluje v ozadju in na podlagi podatkov v tako imenovanih cron tabelah izvaja načrtovana opravila.

Če si želite ogledati obstoječo tabelo opravil cron, uporabite naslednji ukaz:

$ crontab –l
Pri načrtovanju izvajanja skripta po urniku crontab sprejme podatke o tem, kdaj je treba opravilo izvesti v naslednji obliki:

Minuta, ura, dan v mesecu, mesec, dan v tednu.
Na primer, če želite, da se določen skript z imenom ukaz izvaja vsak dan ob 10.30, bo to ustrezalo naslednjemu vnosu v tabeli opravil:

30 10 * * * ukaz
Tukaj nadomestni znak "*", uporabljen za polja za dan v mesecu, mesec in dan v tednu, pomeni, da mora cron zagnati ukaz vsak dan v mesecu ob 10.30.

Če na primer želite, da se skript izvaja vsak ponedeljek ob 16.30, boste morali v tabeli opravil ustvariti naslednji vnos:

30 16 * * 1 ukaz
Oštevilčevanje dni v tednu se začne z 0, 0 pomeni nedeljo, 6 pomeni soboto. Tukaj je še en primer. Tukaj bo ukaz izvršen ob 12. uri prvega dne v mesecu.

00 12 1 * * ukaz
Meseci so oštevilčeni od 1.
Če želite dodati vnos v tabelo, morate poklicati crontab s stikalom -e:

Crontab –e
Nato lahko vnesete ukaze za ustvarjanje urnika:

30 10 * * * /home/likegeeks/Desktop/myscript
Zahvaljujoč temu ukazu bo skript klican vsak dan ob 10.30. Če naletite na napako »Vir začasno ni na voljo«, zaženite spodnji ukaz kot root:

$ rm -f /var/run/crond.pid
Periodične zagone skriptov z uporabo cron lahko organizirate še lažje z uporabo več posebnih imenikov:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Če datoteko skripta postavite v enega od njih, se bo izvajala vsako uro, dan, teden ali mesec.

Zaženi skripte ob prijavi in ​​zagonu lupine

Avtomatizirate lahko zagon skriptov na podlagi različnih dogodkov, kot je prijava uporabnika ali zagon lupine. Preberete lahko o datotekah, ki se obdelujejo v takih situacijah. To so na primer naslednje datoteke:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Če želite zagnati skript ob prijavi, postavite njegov klic v datoteko .bash_profile.

Kaj pa izvajanje skriptov, ko odprete terminal? Datoteka .bashrc vam bo pomagala organizirati to.

Rezultati

Danes smo razpravljali o vprašanjih, povezanih z upravljanjem življenski krog skripte, smo se pogovarjali o tem, kako izvajati skripte v ozadju, kako načrtovati njihovo izvajanje. Naslednjič preberite o funkcijah v skriptih bash in razvoju knjižnice.

Dragi bralci! Ali uporabljate orodja za načrtovanje izvajanja skriptov ukazne vrstice po urniku? Če da, nam povejte o njih.

Storitev terminala Linux privzeto deluje v enoopravilnem načinu. To pomeni, da vsaka izstreljena posadka blokira terminal, dokler ni dokončan. Ta pristop ni primeren pri izvajanju programov, ki zahtevajo dolg čas izvajanja. Ta problem lahko rešite na dva načina: odprite dodatno terminalsko okno in v njem izvedite drug ukaz ali uporabite način ozadja. Vsi trenutni operacijski sistemi, vključno z Linuxom, so večopravilni, kar pomeni možnost hkratnega izvajanja več programov.

Kako lahko vodim brigado v ozadju, da lahko takoj dostopam do vmesnika ukazne vrstice? Posadka, ki je bila prisiljena teči, se imenuje proces v ozadju. Procesi v ozadju niso prikazani na zaslonu. Na primer, strežnik Apache HTTPD deluje v ozadju in služi spletnim stranem. Lupinski skript ali kateri koli ukaz lahko postavite v način nizke prioritete. Nalogo (na primer posadko ali skript) lahko postavite v ozadje tako, da dodate »&« na konec ukazne vrstice. Ta stavek postavi ukaz v ozadje in sprosti prostor v terminalu. Ekipa, ki deluje v ozadju, se imenuje delo. Medtem ko se ukaz v ozadju izvaja, je možno izvajati druge ukaze. Sintaksa je naslednja:

ukaz & ime-skripta & /pot/do/ukaza arg1 arg2 & ukaz-1 | ukaz-2 arg1 & ukaz-1 | ukaz-2 -arg1 -arg2 >/pot/do/izhoda &

Za zagon programov v ozadju, ne da bi blokirali terminalsko okno, morate uporabiti poseben inštruktor »&«. Ta znak postavite na sam konec vrstice, potem ko ste določili ime ukaza, možnosti in vhodne parametre. IN splošni pogled to zaporedje lahko vnesete kot "ime_ukaza -možnost vhodni_parameter &".

ls ~/* > ~/testna-datoteka.txt &
18960

Po pritisku na gumb Enter se program samodejno zažene v ozadju. V tem primeru bo terminal prikazal vrstico z naslednjo vsebino »[številka_opravila] identifikator_procesa« in vas bo pozval, da vnesete novo ustvarjen ukaz.

Poiščite ukaze, ki se v Linuxu izvajajo v ozadju

Zaženite naslednji ukaz:

Primer izpisa podatkov:

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

Kje so identifikatorji naročil.

Za prikaz ID-jev procesov za ID-je opravil poleg standardnih pretvorb posredujte možnost -l:

Primer izpisa podatkov:

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

Za prikaz samo ID-jev procesov vnesite:

Primer izpisa podatkov:

Ustavite izvajanje ukazov, ki se izvajajo v ozadju

Če želite na silo ali elegantno prekiniti proces, uporabite ukaz kill. Sintaksa je naslednja:

ubij PID
ubiti -15 PID
ubij -9 PID
killall proces-Ime-Tukaj
killall -15 Ime procesa-Tukaj
killall -9 ime procesa-tukaj

Vrnitev programa v način ospredja v Linuxu

Linux vam omogoča ne samo izvajanje programov v ozadju, ampak tudi vrnitev v normalno izvajanje, če želite. Za to obstajata dve orodji: ukaz ( Tim je skupina ljudi, ki jih združujejo skupni motivi in ​​interesi.) fg in operator %. Načelo njihovega prizadevanja je izjemno preprosto. fg zahteva navedbo številke opravila kot parametra in jo je treba nadomestiti z % takoj za operatorjem brez presledkov.

najdi / -ime .ini 2> ~/results.txt &
19090
fg 1
bash: fg: naloga končana
+ Izhod 1 find / -name .ini 2> ~/results.txt

V bistvu je operacijski sistem sestavljen iz jedra in ogromnega nabora programov, ki so zasnovani za opravljanje različnih nalog, vzdrževanje sistema in zadovoljevanje potreb uporabnika. Skoraj vsa interakcija med uporabnikom in operacijskim sistemom poteka prek programov. Zato je pomembno, da začetniki razumejo, kako zagnati program v Linuxu, kaj se zgodi med zagonom in kakšni so načini zagona.

Preden preidemo na zagon programov, moramo najprej razumeti, kaj je program. V Linuxu se programi od drugih datotek razlikujejo samo po tem, da imajo nastavljeno izvršljivo zastavo. O tem sem že podrobno pisal v članku, zato ne bom ponavljal.

Vse programe lahko razdelimo na več vrst:

  • Binarni programi- vsebujejo navodila procesorju, ki so pripravljena na izvajanje, večina programov je v tem formatu, so hitri in jih sistem takoj izvede;
  • Programi z bajtno kodo- to niso več ukazi procesorja, temveč ukazi določenega virtualnega stroja, ki jih lahko izvede, brez virtualnega stroja pa takih ukazov ni mogoče izvesti. Takšni programi porabijo več virov, vendar so tudi precej hitri, njihova prednost je, da jih je mogoče izvajati brez spreminjanja kjerkoli lahko delujejo navidezni stroj. Takšni programi vključujejo programe Java.
  • Skriptni programi- ti programi so sestavljeni iz nabora ukazov v navadnem besedilu, ki jih izvaja poseben tolmač. Takšni programi so počasnejši, vendar jih je lažje razviti in njihovo kodo enostavno in hitro spremeniti.

Zdaj pa preidimo na zagon programov.

Izvajanje programov v terminalu

Sprva v operacijskih sobah Unix sistemi in Linux nista imela grafičnega vmesnika, zato so se programi zaganjali z ukazi s terminala. Zdaj je tudi to mogoče in ga izkušeni uporabniki precej aktivno uporabljajo. Sintaksa zagona programa izgleda takole:

/pot/do/datoteke/programa opcije

Parametri so podani le, ko so potrebni, vendar mora lupina vedno poznati celotno pot do programa. Vse za imenom programa in presledkom so parametri. Verjetno ste že opazili, da pri izvajanju programov običajno ne navedemo celotne poti. Bilo bi zelo dolgo in neprijetno.

Razvijalci so našli rešitev. Ustvarjena je bila spremenljivka PATH, ki shranjuje vse poti do map, kjer se običajno nahajajo programi - /bin, /sbin, /usr/bin, /usr/sbin itd. Njegovo vsebino si lahko ogledate z ukazom:

Ko vtipkate ime programa, sistem poišče izvršljivo datoteko s tem imenom v vseh mapah iz POTI in če jo najde, jo izvede. Če take datoteke ni, se prikaže sporočilo »ukaz ni bil najden«. Če želite zagnati enega od sistemskih programov, preprosto vnesite njegovo ime izvršljiva datoteka, Na primer:

Za presledkom lahko posredujete parametre:

Ko programa ni v teh imenikih, morate podati celotno pot do njega:

/usr/local/bin/ls1

Če želite program zagnati prek ubuntu terminal, ki se nahaja v trenutni mapi, bo situacija nekoliko drugačna. Sistem išče samo mape v spremenljivki PATH; ne išče trenutnega imenika. Če torej vnesete ime izvršljive datoteke, boste prejeli napako. Določiti morate celotno pot, kot se spomnite, da bo./:

Včasih je potrebno prenesti nekaj posebnega. Na primer, spremenljivka EDITOR označuje, kateri urejevalnik besedil je treba uporabiti kot privzeto. Ime spremenljivke in njeno vrednost lahko določite pred imenom ukaza s sintakso:

ime_spremenljivke = ukaz vrednosti

Na primer:

EDITOR=nano vido

Ta ukaz privzeto odpre nastavitve v urejevalniku Vim, vendar s tem spremenljivka okolja nastavitve se odprejo v urejevalniku nano.

Zagon programov kot drug uporabnik

Že veste, kako zagnati program linux terminal, kaj pa drugi uporabniki? V operacijskem sistemu Windows je precej običajno zagnati programe kot skrbnik, tako da lahko program pridobi več pravic dostopa do sistema. V Linuxu se za to uporablja pripomoček sudo. Njeno ime je mogoče dešifrirati kot sčarovnica u ser narediti- spremenite uporabnika in izvedite. Pripomoček privzeto zažene ukaz kot korenski superuporabnik:

ukaz sudo
sudo whoami

Toda z možnostjo -u lahko program zaženete kot kateri koli uporabnik, prijavljen v sistem:

ukaz sudo -u uporabniško ime
sudo -u postgres whoami

Ukaz whoami (kdo sem jaz) prikaže ime trenutnega uporabnika.

Kako zagnati program v ozadju

Včasih je treba v terminalu zagnati dolgotrajen program, da ne moti nadaljnjega dela. Če želite to narediti, lahko uporabite izvajanje programa v ozadju v sistemu Linux:

ime_programa &

Na primer:

dd if=/dev/zero of=~/file count=100000 &

Sistem bo izpisal PID, enolični identifikator programa, ki ga lahko nato uporabite, da ga zaprete:

Kako zagnati skript v Linuxu

Rekli smo že, da so programi razdeljeni na binarne in interpretirane. Prej smo govorili le o binarnih programih. Za zagon interpretiranih programov potrebujete neposredno tolmača; taki programi vključujejo tiste, ki so napisani v jezikih, kot so Java, Python, Perl, Ruby, PHP, NodeJS in mnogi drugi. Sintaksa za zagon takega programa je drugačna:

tolmač /pot/do/datoteke/programa opcije

Različni tolmači se obnašajo drugače, zato je bolje takoj določiti celotno pot do programa. Python običajno pobere skripte iz trenutne mape, ne da bi navedel celotno pot:

python hellowrld.py

In programe Java je treba zagnati takole:

java -jar program.jar

Za interpretirane programske datoteke je zastavica izvršljivosti neobvezna, saj se kot parameter posredujejo glavnemu programu. Izjema so le skripti Bash. Skript lahko zaženete s tolmačem:

Ali pa preprosto vnesite pot do skripta:

Lupina sama določi svoje skripte z zastavico izvršljivosti in jih izvede. Če zastavica za izvedljivost ni nastavljena, jo dodajte:

sudo chmod u+x ./script.sh

Zato so za večino interpretiranih programov ustvarjeni preprosti skripti sh, ki jih je mogoče hitro zagnati.

Izvajanje programov Linux v GUI

Preko grafičnega vmesnika je veliko bolj priročno izvajati programe. Če na ta način ni mogoče zagnati konzolnih programov, potem obstajajo bližnjice za vse grafične pripomočke, ki jih najdete v glavnem meniju sistema:

Druga možnost je, da program zaženete iz upravitelj datotek, z dvojnim klikom miške, vendar je treba zanj nastaviti zastavico za izvedljivost.

Izvajanje skriptov grafični vmesnik. Vse menijske bližnjice najdete v imeniku /usr/share/applications/. Vsak program lahko zaženete z dvojnim klikom od tukaj. Toda poglejmo, kaj je znotraj bližnjice; za to jo odprite v urejevalniku besedila:


Med drugim vrstica Exec podaja ukaz, ki se izvaja programi za linux ko dvakrat kliknete na bližnjico. Lahko izberete eno od obstoječih bližnjic in na njeni podlagi ustvarite svojo. To je preprosto ime programa. Vendar je pomembno upoštevati, da je bolje določiti celotno pot na mestih, kot so bližnjice, skripte, cron in tako naprej, saj bo to zmanjšalo število napak, saj ne morete vedeti, ali sistem v tem primeru preverja PATH oz. išče program samo v trenutnem imeniku. Zdaj veste vse o tem, kako zagnati program v Linuxu.

zaključki

V tem članku smo pogledali, kako zagnati program prek terminala ubuntu ali drugega Linux distribucije. Čeprav se zdi, da je to zelo preprosta tema, obstaja nekaj zanimivih točk, ki so lahko koristne. Ampak zanje že veste. Če imate kakršna koli vprašanja, jih vprašajte v komentarjih!