Naredba za pokretanje Linuxa u pozadini. Kako pokrenuti program na Linuxu. Brisanje poslova na čekanju

Zadaci i procesi

Poziva se svaki program koji radi na Linuxu proces. Linux kao multitasking sistem karakteriše činjenica da se mnogi procesi koji pripadaju jednom ili više korisnika mogu izvršavati istovremeno. Možete prikazati listu procesa koji su trenutno pokrenuti pomoću naredbe ps, na primjer, kako slijedi:

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

Imajte na umu da je po defaultu komanda ps prikazuje listu samo onih procesa koji pripadaju korisniku koji ga je pokrenuo. Da vidite sve procese koji se pokreću u sistemu, morate izdati naredbu ps -a . Procesni brojevi(ID procesa ili PID), navedeni u prvoj koloni, su jedinstveni brojevi koje sistem dodeljuje svakom pokrenutom procesu. Posljednja kolona, ​​naslovljena KOMANDA, označava naziv naredbe koja se izvodi. U ovom slučaju, lista sadrži procese koje je pokrenuo sam korisnik Larry. Postoji mnogo drugih procesa koji se pokreću u sistemu, oni puna lista može se pogledati komandom ps-aux. Međutim, među naredbama koje pokreće korisnik larry, postoji samo bash (komandna ljuska za korisnika larry) i sama naredba ps. Može se vidjeti kako bash shell radi istovremeno sa naredbom ps. Kada je korisnik unio komandu ps, bash shell je počeo da ga izvršava. Nakon ekipe ps je završio svoj rad (prikazuje se tabela procesa), kontrola se vraća bash procesu. Zatim bash shell prikazuje prompt i čeka novu naredbu.

Poziva se i tekući proces zadatak(posao). Termini proces i zadatak koriste se naizmjenično. Međutim, obično se proces naziva zadatkom kada to znači upravljanje poslom(kontrola posla). Kontrola poslova je funkcija komandne ljuske koja korisniku daje mogućnost prebacivanja između više poslova.

U većini slučajeva, korisnici će pokrenuti samo jedan zadatak - ovo će biti posljednja naredba koju su unijeli u komandnu ljusku. Međutim, mnoge ljuske (uključujući bash i tcsh) imaju funkcije upravljanje poslom(kontrola posla), što vam omogućava da pokrenete nekoliko komandi u isto vrijeme ili zadataka(poslove) i, po potrebi, prebacivati ​​se između njih.

Upravljanje poslovima može biti korisno ako, na primjer, uređujete veliki tekstualnu datoteku i želite privremeno prekinuti uređivanje kako biste izvršili neku drugu operaciju. Možete koristiti funkcije upravljanja poslovima da privremeno napustite uređivač, vratite se na prompt ljuske i izvršite druge radnje. Kada su gotovi, možete se vratiti radu sa uređivačem i pronaći ga u istom stanju u kojem je ostavljen. Postoji još mnogo korisnih upotreba funkcija upravljanja poslom.

Način rada u prednjem planu i pozadini

Zadaci mogu biti oba prednji plan(prednji plan), ili pozadini(pozadina). U svakom trenutku može biti samo jedan zadatak u prvom planu. Zadatak u prvom planu je zadatak s kojim ste u interakciji; prima ulaz sa tastature i šalje izlaz na ekran (osim ako, naravno, niste preusmerili ulaz ili izlaz negde drugde). protiv, pozadinske poslove ne primaju unos sa terminala; Obično takvi poslovi ne zahtijevaju interakciju korisnika.

Nekim zadacima je potrebno jako dugo da se završe i ništa se zanimljivo ne dešava dok se izvršavaju. Primjer takvih zadataka je kompajliranje programa, kao i komprimiranje velikih datoteka. Nema razloga da buljite u ekran i čekate da se ovi zadaci završe. Takve poslove treba izvoditi pozadini. Za to vrijeme možete raditi s drugim programima.

Za kontrolu izvršavanja procesa u Linuxu, obezbjeđen je mehanizam prijenosa signale. Signal je sposobnost procesa da razmjenjuju standardne kratke poruke direktno koristeći sistem. Signalna poruka ne sadrži nikakve informacije osim broja signala (radi praktičnosti, umjesto broja može se koristiti ime koje je unaprijed definirao sistem). Da bi prenio signal, proces treba da koristi samo sistemski poziv ubiti(), a da biste primili signal, nije vam potrebno ništa. Ako proces treba da odgovori na signal na neki poseban način, može se registrovati rukovalac, a ako ne postoji rukovalac, sistem će reagovati na njega. Obično to uzrokuje da se proces koji je primio signal odmah završi. Pokreće se rukovalac signalom asinhrono, odmah po prijemu signala, bez obzira na to šta proces radi u tom trenutku.

Dva signala - broj 9 ( KILL) i 19 ( STOP) - uvijek obrađuje sistem. Prvi od njih je potreban da bi se proces sigurno ubio (otuda i naziv). Signal STOP suspenduje proces: u ovom stanju, proces se ne uklanja iz tablice procesa, ali se ne izvršava sve dok ne primi signal 18 ( CONT) - nakon čega će nastaviti sa radom. U Linux komandnoj ljusci, signal STOP može se proslijediti aktivnom procesu pomoću escape sekvence Ctrl -Z .

Signal broj 15 ( TERM) služi za prekid posla. At prekid(prekid) proces posla umire. Poslovi se obično prekidaju escape sekvencom Ctrl -C. Ne postoji način da vratite prekinuti posao. Također biste trebali biti svjesni da neki programi presreću signal TERM(pomoću rukovaoca), tako da pritiskom na kombinaciju tastera Ctrl -C(o) ne može odmah prekinuti proces. Ovo se radi kako bi program mogao uništiti tragove svog rada prije nego što se završi. U praksi se neki programi uopće ne mogu prekinuti na ovaj način.

Prebacivanje u pozadinu i uništavanje poslova

Počnimo sa jednostavan primjer. Pogledajmo naredbu yes, koja na prvi pogled može izgledati beskorisno. Ova naredba šalje beskonačan tok nizova koji se sastoje od znaka y na standardni izlaz. Pogledajmo kako ova komanda funkcionira:

/home/larry# da y y y y y

Niz takvih linija će se nastaviti u nedogled. Ovaj proces možete uništiti slanjem signala prekida, odnosno pritiskom Ctrl -C. Hajde da sada uradimo stvari drugačije. Kako bismo spriječili da se ovaj beskrajni niz bude prikazan na ekranu, preusmjerit ćemo standardni izlaz naredbe yes na /dev/null. Kao što možda znate, /dev/null uređaj djeluje kao "crna rupa": svi podaci poslani na ovaj uređaj se gube. Korištenjem ovog uređaja vrlo je zgodno riješiti se previše izlaza iz nekih programa.

/home/larry# da > /dev/null

Sada se ništa ne prikazuje na ekranu. Međutim, shell prompt se također ne vraća. To je zato što naredba yes još uvijek radi i šalje svoje poruke koje se sastoje od slova y na /dev/null. Također možete uništiti ovaj zadatak slanjem signala prekida.

Sada recimo da želite da komanda yes nastavi da radi, ali i da vratite shell prompt na ekran kako biste mogli da radite sa drugim programima. Da biste to učinili, možete staviti naredbu yes u pozadinu i ona će tamo raditi bez komunikacije s vama.

Jedan od načina da se proces stavi u pozadinu je dodavanje & na kraj naredbe. primjer:

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

Poruka je broj posla(broj posla) za proces da. Komandna ljuska dodjeljuje broj posla svakom poslu koji izvodi. Budući da je yes jedini izvršni posao, dodijeljen mu je broj 1. Broj 164 je identifikacijski broj povezan sa ovim procesom (PID), a ovaj broj je također dodijeljen procesu od strane sistema. Kao što ćemo kasnije vidjeti, procesu se može pristupiti navođenjem oba ova broja.

Dakle, sada imamo yes proces koji radi u pozadini, kontinuirano šalje tok y na /dev/null uređaj. Da biste saznali status ovog procesa, potrebno je izvršiti naredbu poslovi, što je interna naredba ljuske.

/home/larry# poslovi + Pokreni da >/dev/null & /home/larry#

Vidimo da ovaj program zaista radi. Da biste saznali status zadatka, možete koristiti i naredbu ps, kao što je prikazano iznad.

Da bi se prenio signal procesu (najčešće postoji potreba prekinuti posao) se koristi uslužni program ubiti. Ovoj naredbi se daje ili broj posla ili PID kao argument. Opcijski parametar je broj signala koji treba poslati procesu. Standardno se signal šalje TERM. U gornjem slučaju, broj posla je bio 1, tako da je komanda ubiti %1će prekinuti posao. Kada se poslu pristupa preko njegovog broja (a ne njegovog PID-a), tada tom broju mora prethoditi simbol procenta (“%”) u komandnoj liniji.

Sada unesite komandu poslovi ponovo da provjerite rezultat prethodne radnje:

/home/larry# poslovi Prekinuti da >/dev/null

U stvari, posao je uništen i sljedeći put kada unesete naredbu jobs, na ekranu neće biti informacija o njemu.

Također možete prekinuti posao koristeći identifikacijski broj procesa (PID). Ovaj broj, zajedno sa identifikacionim brojem posla, je naznačen kada posao započne. U našem primjeru, PID vrijednost je bila 164, dakle naredba ubiti 164 bilo bi ekvivalentno komandi ubiti %1. Kada koristite PID kao argument naredbi kill, ne morate unositi znak "%".

Pauziranje i nastavak poslova

Prvo započnimo proces sa komandom yes u prvom planu, kao što je to učinjeno ranije:

/home/larry# da > /dev/null

Kao i ranije, pošto proces radi u prvom planu, shell prompt se ne vraća na ekran.

Sada, umjesto da prekidate zadatak kombinacijom tipki Ctrl -C, zadatak je moguć suspendovati(suspend, doslovno - suspendirati), šaljući mu signal STOP. Da biste pauzirali zadatak, morate pritisnuti odgovarajuću kombinaciju tipki, obično ovo Ctrl -Z .

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

Obustavljeni proces se jednostavno ne izvršava. Ne troši procesorske resurse. Obustavljeni zadatak može se pokrenuti s iste tačke kao da nije suspendovan.

Da biste nastavili posao koji se izvodi u prvom planu, možete koristiti naredbu fg(od riječi foreground - prvi plan).

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

Komandna ljuska će još jednom prikazati naziv komande tako da korisnik zna na kojem se zadatku nalazi. ovog trenutka lansirana u prvi plan. Pauzirajmo ovaj zadatak ponovo pritiskom na tipke Ctrl -Z, ali ovaj put pokrenimo ga u pozadinu pomoću naredbe bg(od riječi pozadina - pozadina). Ovo će uzrokovati da se proces pokrene kao da je pokrenut pomoću naredbe sa & na kraju (kao što je učinjeno u prethodnom odjeljku):

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

Shell prompt se vraća. Sada tim poslovi mora pokazati da proces da trenutno radi; ovaj proces se može uništiti komandom ubiti, kao što je to ranije urađeno.

Ne možete koristiti prečicu na tastaturi da pauzirate zadatak koji se izvodi u pozadini Ctrl -Z. Prije pauziranja posla, on mora biti postavljen u prvi plan pomoću naredbe fg i tek onda stati. Dakle, komanda fg može se primijeniti ili na suspendirane poslove ili na posao koji radi u pozadini.

Postoji velika razlika između pozadinskih poslova i obustavljenih poslova. Obustavljeni zadatak ne radi - na njega se ne troši novac računarske snage procesor. Ovaj posao ne izvodi nikakvu radnju. Obustavljeni zadatak zauzima određenu količinu RAM-a računara; nakon nekog vremena, kernel će ispumpati ovaj dio memorije kako bi HDD « poste restante" Nasuprot tome, pozadinski posao se izvodi, koristi memoriju i radi neke stvari koje biste možda željeli učiniti, ali možda radite na drugim programima u isto vrijeme.

Poslovi koji se izvršavaju u pozadini mogu pokušati prikazati neki tekst na ekranu. To će ometati rad na drugim zadacima.

/home/larry# da &

Ovdje standardni izlaz nije preusmjeren na /dev/null uređaj, tako da će beskonačan tok znakova y biti ispisan na ekranu. Ova nit se ne može zaustaviti zbog kombinacije tipki Ctrl -C ne utiče na poslove u pozadini. Da biste zaustavili ovaj izlaz, trebate koristiti naredbu fg, koji će zadatak staviti u prvi plan, a zatim ga uništiti kombinacijom tipki Ctrl -C .

Da damo još jednu napomenu. Obično po timu fg i tim bg utjecati na one poslove koji su nedavno obustavljeni (ovi poslovi će biti označeni sa + simbolom pored broja posla ako unesete naredbu poslovi). Ako se jedan ili više poslova izvodi u isto vrijeme, poslovi se mogu postaviti u prvi plan ili pozadinu navođenjem komandi kao argumenata fg ili komande bg njihov identifikacioni broj (ID posla). Na primjer, naredba fg %2 stavlja zadatak broj 2 na čelo i komandu bg %3 stavlja posao broj 3 u pozadinu. Koristite PID-ove kao argumente komande fg I bg zabranjeno je.

Štaviše, da biste posao postavili u prvi plan, možete jednostavno odrediti njegov broj. Da, tim %2 bit će ekvivalentna naredbi fg %2 .

Važno je zapamtiti da funkcija kontrole posla pripada ljusci. Timovi fg , bg I poslovi su interni timoviškoljke. Ako iz nekog razloga koristite komandnu ljusku koja ne podržava funkcije upravljanja poslovima, tada u njoj nećete pronaći ove (i slične) komande.

Administriranje servera koji pokreće Linux često je praćeno višestrukim manipulacijama naredbama u prozoru terminala. Ovo je poznata slika za one koji administriraju servere na Linuxu, a u nekim slučajevima je zgodno izvoditi komande u pozadini. Ovo bi se moglo koristiti u praksi, a vrijedi napomenuti i razloge zašto bi moglo biti korisno:
— Kada je terminal preopterećen gomilom poruka i nije moguće paralelno izvršiti dodatne radnje;
— Ako zatvorite terminal, trenutni proces i njegovi podređeni procesi se zaustavljaju;
Ovi problemi se mogu jednostavno riješiti; jednostavnim riječima, moramo potpuno odvojiti tekući proces od kontrolnog terminala.

U ovom postu ćemo pogledati korisnu sposobnost Linuxa da pokreće komande u pozadini. Drugim riječima, proces koji pokrenete će se izvršiti odvojeno od kontrolnog terminala.

Kako pokrenuti komande ili procese u pozadini
Ako se vaš proces izvodi u prozoru terminala, možete ga pauzirati pomoću naredbe Ctrl+Z, vjerovatno mnogi to znaju i pomislit će, pa šta. I evo što je zanimljivo, nakon što smo na taj način obustavili proces, možemo ga nastaviti u pozadini, da bismo to učinili potrebno je unijeti komandu

Nakon unosa ove naredbe, proces će se nastaviti, ali u pozadini. Da biste vidjeli sve procese koji se pokreću u pozadini, možete unijeti naredbu

Pogledajmo jednostavan primjer kako se ovo može primijeniti. Recimo da imamo , koji treba da raspakujemo, ali nemamo vremena da čekamo, i želimo da radimo paralelno.

Raspakivanje arhive u pozadini

$ tar -czf home.tar.gz .

Kliknite Cntr+Z, zatim unesite komande

$bg$jobs

Drugi način je da dodate & na kraju naredbe, to će reći sistemu da pokrene komandu u pozadini.

$ tar -czf home.tar.gz . &$poslovi

Ova metoda omogućava da se procesi izvode u pozadini, međutim, STDIN, STDOUT, STDERR su još uvijek spojeni na terminal. Sada osigurajmo da proces radi čak i kada je terminal zatvoren.

Izvršavanje procesa nakon zatvaranja prozora terminala
Da bi proces nastavio da radi čak i nakon zatvaranja prozora terminala, možemo koristiti naredbu odreći se. “Otkačit će” proces sa ljuske prozora terminala, nakon čega će se izvršiti čak i nakon što se prozor konzole zatvori.
Pogledajmo primjer korištenja standardne naredbe rsync, pokušajmo da ga izvršimo u pozadini i odvojimo proces od terminala.

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

Također možete koristiti naredbu nohup, to će omogućiti da proces nastavi da radi čak i kada korisnik izađe iz sistemske ljuske.

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

Kako odvojiti proces od Linux kontrolnog terminala
Da biste potpuno odvojili proces od kontrolnog terminala, možete koristiti i naredbu koja će biti efikasna kada koristite grafičko korisničko sučelje (GUI), na primjer, pretraživač Firefox.

$firefox/dev/null &

IN Linux sistem(i na skoro svim Unix sistemima) /dev/null je posebna datoteka uređaja, koja se još naziva i “null device”. Upisivanje u njega se obavlja uspješno, bez obzira na količinu snimljenih informacija; čitanje iz njega je ekvivalentno čitanju kraja datoteke (EOF).

Prošli put smo razgovarali o radu sa ulaznim, izlaznim i tokovima grešaka u bash skriptama, deskriptorima datoteka i preusmjeravanju tokova. Sada već znate dovoljno da napišete nešto svoje. U ovoj fazi savladavanja bash-a, možda ćete imati pitanja o tome kako upravljati pokrenutim skriptama i kako automatizirati njihovo pokretanje.

Do sada smo kucali imena skripti u komandnu liniju i pritiskali Enter, što uzrokuje da se programi odmah pokreću, ali to nije slučaj. jedini način skripte za pozivanje. Danas ćemo razgovarati o tome kako skripta može raditi sa Linux signalima, o različitim pristupima pokretanju skripti i upravljanju njima tokom rada.

Linux signali

U Linuxu postoji više od tri desetine signala koje generiše sistem ili aplikacije. Evo liste najčešće korišćenih, koje će vam svakako dobro doći prilikom izrade skripti komandna linija.
Signalni kod
Ime
Opis
1
SIGHUP
Zatvaranje terminala
2
SIGINT
Signal za zaustavljanje procesa od strane korisnika sa terminala (CTRL + C)
3
SIGQUIT
Signal za zaustavljanje procesa od strane korisnika s terminala (CTRL + \) s dumpom memorije
9
SIGKILL
Bezuslovno okončanje procesa
15
SIGTERM
Signal zahtjeva za prekid procesa
17
SIGSTOP
Prisilno obustavljanje procesa, ali ne i prekid
18
SIGTSTP
Pauziranje procesa s terminala (CTRL+Z), ali se ne gasi
19
SIGCONT
Nastavite s izvršavanjem prethodno zaustavljenog procesa

Ako bash shell primi signal SIGHUP kada zatvorite terminal, izlazi. Prije izlaska, šalje SIGHUP signal svim procesima koji se u njemu pokreću, uključujući pokrenute skripte.

Signal SIGINT uzrokuje privremeno zaustavljanje rada. Linux kernel prestaje da dodeljuje vreme procesora ljusci. Kada se to dogodi, ljuska obavještava procese šaljući im SIGINT signal.

Bash skripte ne kontroliraju ove signale, ali ih mogu prepoznati i izvršiti određene naredbe kako bi pripremile skriptu za posljedice uzrokovane signalima.

Slanje signala skriptama

Bash shell vam omogućava da šaljete signale skriptama koristeći prečice na tastaturi. Ovo je vrlo korisno ako trebate privremeno zaustaviti pokrenutu skriptu ili prekinuti njen rad.

Završetak procesa

Kombinacija CTRL tasteri+C generiše SIGINT signal i šalje ga svim procesima koji rade u ljusci, uzrokujući njihov prekid.

Pokrenimo sljedeću naredbu u ljusci:

spavaj 100 dolara
Nakon toga ćemo završiti njegov rad kombinacijom tipki CTRL + C.


Završite proces sa tastature

Privremeno zaustavljanje procesa

Kombinacija tipki CTRL + Z generiše SIGTSTP signal, koji suspenduje proces, ali ga ne prekida. Takav proces ostaje u memoriji i njegov rad se može nastaviti. Pokrenimo naredbu u ljusci:

spavaj 100 dolara
I privremeno ga zaustavite kombinacijom tipki CTRL + Z.


Pauzirajte proces

Broj u uglastim zagradama je broj posla koji ljuska dodjeljuje procesu. Školjka tretira procese koji se izvode unutar nje kao poslove sa jedinstvenim brojevima. Prvom procesu je dodijeljen broj 1, drugom - 2 i tako dalje.

Ako pauzirate posao vezan za shell i pokušate izaći iz njega, bash će izdati upozorenje.

Obustavljene poslove možete pogledati sljedećom komandom:

Ps –l


Lista zadataka

U koloni S, koja prikazuje status procesa, T je prikazan za suspendirane procese. Ovo ukazuje da je naredba ili suspendirana ili u stanju praćenja.

Ako trebate prekinuti suspendirani proces, možete koristiti naredbu kill. Možete pročitati detalje o tome.

Njen poziv izgleda ovako:

Kill processID

Presretanje signala

Da biste omogućili praćenje Linux signala u skripti, koristite naredbu trap. Ako skripta primi signal naveden prilikom pozivanja ove komande, obrađuje ga nezavisno, dok ljuska neće obraditi takav signal.

Naredba trap omogućava skripti da odgovori na signale koje bi inače ljuska obrađivala bez njene intervencije.

Pogledajmo primjer koji pokazuje kako naredba trap specificira kod koji treba izvršiti i listu signala, razdvojenih razmacima, koje želimo presresti. U ovom slučaju to je samo jedan signal:

#!/bin/bash trap "echo " Zarobljeni Ctrl-C"" SIGINT echo Ovo je test skripta count=1 dok [ $count -le 10 ] radi echo "Loop #$count" sleep 1 count=$(($ broj + 1)) urađeno
Naredba trap korištena u ovom primjeru daje izlaz tekstualna poruka kad god detektuje SIGINT signal, koji se može generisati pritiskom na Ctrl + C na tastaturi.


Presretanje signala

Svaki put kada pritisnete CTRL + C, skripta izvršava naredbu echo navedenu prilikom pozivanja praćenja umjesto da dozvoli ljusci da je prekine.

Možete presresti izlazni signal skripte koristeći naziv EXIT signala kada pozivate trap komandu:

#!/bin/bash trap "echo Goodbye..." EXIT count=1 dok [ $count -le 5 ] radi echo "Loop #$count" spavanje 1 count=$(($count + 1)) gotovo


Presretanje izlaznog signala skripte

Kada skripta izađe, bilo normalno ili zbog SIGINT signala, ljuska će presresti i izvršiti echo komandu.

Modifikacija presretnutih signala i otkazivanje presretanja

Da biste izmijenili signale koje presreće skripta, možete pokrenuti trap naredbu s novim parametrima:

#!/bin/bash trap "echo "Ctrl-C je zarobljen." SIGINT count=1 dok [ $count -le 5 ] radi echo "Loop #$count" sleep 1 count=$(($count + 1) ) završeno trap "echo "Modifikovao sam zamku!"" SIGINT count=1 dok [ $count -le 5 ] uradi echo "Druga petlja #$count" spavanje 1 count=$(($count + 1)) urađeno


Modifikacija presretanja signala

Nakon modifikacije, signali će biti obrađeni na novi način.

Presretanje signala se također može otkazati jednostavnim izvršavanjem naredbe trap, prosljeđivanjem dvostruke crtice i naziva signala:

#!/bin/bash trap "echo "Ctrl-C je zarobljen." SIGINT count=1 dok [ $count -le 5 ] radi echo "Loop #$count" sleep 1 count=$(($count + 1) ) završena zamka -- SIGINT echo "Upravo sam uklonio zamku" count=1 dok [ $count -le 5 ] do echo "Druga petlja #$count" spavanje 1 count=$(($count + 1)) gotovo
Ako skripta primi signal prije nego što se presretanje otkaže, obradit će ga kako je navedeno u trenutni tim trap. Pokrenimo skriptu:

$ ./myscript
I pritisnite CTRL + C na tastaturi.


Signal presretnut prije nego što je presretanje poništeno.

Prvo pritiskanje CTRL + C dogodilo se u vrijeme izvršavanja skripte, kada je bilo na snazi ​​presretanje signala, tako da je skripta izvršila komandu eho koja je dodijeljena signalu. Nakon što je izvršenje došlo do naredbe za otkopčavanje, naredba CTRL + C je radila kao i obično, prekidajući skriptu.

Pokretanje skripti komandne linije u pozadini

Ponekad bash skriptama treba dosta vremena da završe zadatak. Međutim, možda ćete morati normalno raditi na komandnoj liniji bez čekanja da se skripta završi. Nije tako teško implementirati.

Ako ste vidjeli listu procesa koje izlazi naredba ps, možda ste primijetili procese koji se pokreću u pozadini i nisu vezani za terminal.
Hajde da napišemo sledeću skriptu:

#!/bin/bash count=1 dok [ $count -le 10 ] spava 1 count=$(($count + 1)) gotovo
Pokrenimo ga tako što ćemo navesti znak ampersanda (&) iza imena:

$ ./myscipt &
To će uzrokovati da se pokrene kao pozadinski proces.


Pokretanje skripte u pozadini

Skripta će biti pokrenuta u pozadinskom procesu, njen identifikator će biti prikazan u terminalu, a kada se završi njeno izvršavanje, vidjet ćete poruku o tome.

Imajte na umu da iako skripta radi u pozadini, ona nastavlja da koristi terminal za slanje poruka na STDOUT i STDERR, što znači da će tekst koji izlazi ili poruke o grešci biti vidljivi u terminalu.


Lista procesa

S ovim pristupom, ako izađete iz terminala, skripta koja radi u pozadini će također izaći.

Šta ako želite da skripta nastavi da radi nakon zatvaranja terminala?

Izvršavanje skripti koje ne izlaze prilikom zatvaranja terminala

Skripte se mogu izvršavati u pozadinskim procesima čak i nakon izlaska iz terminalske sesije. Da biste to učinili, možete koristiti naredbu nohup. Ova komanda vam omogućava da pokrenete program blokiranjem SIGHUP signala koji se šalju procesu. Kao rezultat toga, proces će se izvršiti čak i kada izađete iz terminala u kojem je pokrenut.

Primijenimo ovu tehniku ​​kada pokrećemo našu skriptu:

Nohup ./myscript &
Ovo će biti izlaz na terminal.


Team nohup

Komanda nohup odvezuje proces sa terminala. To znači da će proces izgubiti reference na STDOUT i STDERR. Kako ne bi izgubio izlaz podataka od strane skripte, nohup automatski preusmjerava poruke koje pristižu u STDOUT i STDERR u datoteku nohup.out.

Imajte na umu da ako pokrenete više skripti iz istog direktorija, njihov izlaz će završiti u jednoj nohup.out datoteci.

Pogledaj zadatke

Naredba jobs vam omogućava da vidite trenutne poslove koji se izvode u ljusci. Hajde da napišemo sledeću skriptu:

#!/bin/bash count=1 dok [ $count -le 10 ] echo "Loop #$count" spavanje 10 count=$(($count + 1)) gotovo
Pokrenimo ga:

$ ./myscript
I privremeno ga zaustavite kombinacijom tipki CTRL + Z.


Pokretanje i pauziranje skripte

Pokrenimo istu skriptu u pozadini, dok preusmjeravamo izlaz skripte u datoteku tako da ne prikazuje ništa na ekranu:

$ ./myscript > outfile &
Sada kada izvršite naredbu jobs, vidjet ćemo informacije i o suspendovanoj skripti i o onoj koja radi u pozadini.


Dobijanje informacija o skriptama

Prekidač -l prilikom pozivanja naredbe jobs označava da su nam potrebne informacije o ID-ovima procesa.

Ponovno pokretanje obustavljenih poslova

Da biste ponovo pokrenuli skriptu u pozadini, možete koristiti komandu bg.

Pokrenimo skriptu:

$ ./myscript
Pritisnite CTRL + Z, što će privremeno zaustaviti njegovo izvršavanje. Pokrenimo sljedeću naredbu:

$bg


bg komanda

Skripta sada radi u pozadini.

Ako imate više obustavljenih poslova, možete proslijediti broj posla bg naredbi da ponovo pokrenete određeni posao.

Da ponovo pokrenete posao u normalan način rada koristite naredbu fg:

Planiranje pokretanja skripti

Linux nudi nekoliko načina za pokretanje bash skripti u datom trenutku. Ovo su at command i cron planer poslova.

At komanda izgleda ovako:

U vrijeme [-f filename].
Ova komanda prepoznaje mnoge formate vremena.

  • Standardno, sa naznakom sati i minuta, na primjer - 10:15.
  • Koristeći AM/PM indikatore, prije ili poslije podneva, na primjer - 22:15.
  • Koristeći posebne nazive kao što su sada, podne, ponoć.
Osim što može odrediti vrijeme u kojem bi se posao trebao pokrenuti, naredbi at se također može proslijediti datum koristeći jedan od podržanih formata.
  • Standardni format datuma u kojem se datum piše pomoću obrazaca MMDDYY, MM/DD/YY ili DD.MM.YY.
  • Tekstualni prikaz datuma, na primjer, 4. jul ili 25. decembar, dok se godina može navesti, a možete i bez toga.
  • Snimanje kao sada + 25 minuta.
  • Pogled snimka sutra u 22:15.
  • Vrsta snimanja 10:15 + 7 dana.
Hajde da ne ulazimo dublje u ovu temu, pogledajmo jednostavan slučaj upotrebe naredbe:

$ na -f ./myscript sada


Planiranje poslova pomoću naredbe at

Prekidač -M prilikom poziva na koristi se za slanje onoga čemu skripta izlazi e-mail, ako je sistem konfigurisan na odgovarajući način. Ako se šalje email nije moguće, ovaj prekidač će jednostavno potisnuti izlaz.

Da vidite listu poslova koji čekaju da se izvrše, možete koristiti naredbu atq:


Lista zadataka na čekanju

Brisanje poslova na čekanju

Komanda atrm vam omogućava da izbrišete posao na čekanju. Kada ga pozivate, navedite broj zadatka:

$atrm 18


Brisanje posla

Pokreni skripte prema rasporedu

Zakazivanje vaših skripti za jednokratno pokretanje pomoću naredbe at može olakšati život u mnogim situacijama. Ali šta ako trebate da se skripta izvršava u isto vrijeme svaki dan, jednom sedmično ili jednom mjesečno?

Linux ima uslužni program crontab koji vam omogućava da zakažete skripte koje treba redovno pokretati.

Crontab radi u pozadini i, na osnovu podataka u takozvanim cron tabelama, pokreće zakazane poslove.

Da vidite postojeću tabelu cron zadataka, koristite sljedeću naredbu:

$ crontab –l
Kada planirate da se skripta pokrene po rasporedu, crontab prihvata podatke o tome kada posao treba da se izvrši u sledećem formatu:

Minut, sat, dan u mjesecu, mjesec, dan u sedmici.
Na primjer, ako želite da se određena skripta pod nazivom naredba izvršava svakog dana u 10:30, to će odgovarati sljedećem unosu u tabeli zadataka:

30 10 * * * komanda
Ovdje zamjenski znak "*" koji se koristi za polja dana u mjesecu, mjesecu i danu u sedmici označava da cron treba da pokrene naredbu svakog dana svakog mjeseca u 10:30 ujutro.

Ako, na primjer, želite da se skripta pokreće u 16:30 svakog ponedjeljka, morat ćete kreirati sljedeći unos u tabeli zadataka:

30 16 * * 1 komanda
Numeracija dana u nedelji počinje od 0, 0 znači nedelja, 6 znači subota. Evo još jednog primjera. Ovdje će se naredba izvršavati svakog prvog dana u mjesecu u 12 sati.

00 12 1 * * komanda
Mjeseci se broje počevši od 1.
Da biste dodali unos u tabelu, morate pozvati crontab sa -e prekidačem:

Crontab –e
Zatim možete unijeti komande za generiranje rasporeda:

30 10 * * * /home/likegeeks/Desktop/myscript
Zahvaljujući ovoj komandi, skripta će se pozivati ​​svaki dan u 10:30. Ako naiđete na grešku "Resource privremeno nije dostupan", pokrenite naredbu ispod kao root:

$ rm -f /var/run/crond.pid
Možete još lakše organizirati periodično pokretanje skripti koristeći cron koristeći nekoliko posebnih direktorija:

/etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
Postavljanje datoteke skripte u jedan od njih će uzrokovati da se pokreće svaki sat, dnevno, sedmično ili mjesečno.

Pokrenite skripte prilikom prijave i pokretanja ljuske

Možete automatizirati pokretanje skripti na osnovu različitih događaja, kao što je prijava korisnika ili pokretanje ljuske. Možete čitati o datotekama koje se obrađuju u takvim situacijama. Na primjer, ovo su sljedeći fajlovi:

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Da pokrenete skriptu prilikom prijave, postavite njen poziv u datoteku .bash_profile.

Šta je sa pokretanjem skripti kada otvorite terminal? Datoteka .bashrc će vam pomoći da ovo organizujete.

Rezultati

Danas smo razgovarali o pitanjima vezanim za upravljanje životni ciklus skripte, razgovarali smo o tome kako pokrenuti skripte u pozadini, kako zakazati njihovo izvršavanje. Sljedeći put čitajte o funkcijama u bash skriptama i razvoju biblioteke.

Dragi čitaoci! Da li koristite alate za planiranje skripti komandne linije za pokretanje prema rasporedu? Ako jeste, recite nam nešto o njima.

Usluga Linux terminala radi u režimu jednog zadatka prema zadanim postavkama. To znači da svaka posada koja je pokrenuta blokira terminal dok se ne završi. Ovaj pristup nije prikladan kada se izvode programi koji zahtijevaju dugo vrijeme izvršavanja. Ovaj problem može se riješiti na dva načina: otvoriti dodatni prozor terminala i izvršiti drugu naredbu u njemu ili koristiti pozadinski način rada. Svi trenutni operativni sistemi, uključujući Linux, obavljaju više zadataka, što znači mogućnost istovremenog izvršavanja više programa.

Kako mogu pokrenuti brigadu u pozadini tako da mogu odmah pristupiti interfejsu komandne linije? Posada koja je bila prisiljena da radi naziva se pozadinski proces. Pozadinski procesi se ne prikazuju na ekranu. Na primjer, Apache HTTPD server radi u pozadini za posluživanje web stranica. Možete staviti shell skriptu ili bilo koju komandu u režim niskog prioriteta. Zadatak (na primjer, ekipa ili skripta) se može staviti u pozadinu dodavanjem "&" na kraj komandne linije. Ova izjava stavlja naredbu u pozadinu i oslobađa prostor na terminalu. Tim koji radi u pozadini naziva se posao. Dok je naredba u pozadini pokrenuta, moguće je izvršiti bilo koju drugu naredbu. Sintaksa je sljedeća:

naredba & ime-skripte & /putanja/do/komanda arg1 arg2 & naredba-1 | naredba-2 arg1 & naredba-1 | naredba-2 -arg1 -arg2 >/put/do/izlaz &

Da biste pokrenuli programe u pozadini bez blokiranja prozora terminala, morate koristiti poseban instruktor "&". Postavite ovaj znak na sam kraj reda nakon što navedete ime komande, opcije i ulazne parametre. IN opšti pogled ovaj niz se može unijeti kao “naziv_naredbe -opcija ulazni_parametar &”.

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

Nakon pritiska na tipku Enter, program će se automatski pokrenuti u pozadini. U tom slučaju, terminal će prikazati red sa sljedećim sadržajem “[task_number] process_identifier” i zatražit će od vas da unesete novokreiranu naredbu.

Pronađite komande koje rade u pozadini u Linuxu

Pokrenite sljedeću naredbu:

Primjer izlaza podataka:

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

Gdje su identifikatori naloga.

Za prikaz ID-ova procesa za ID-ove poslova pored standardnih pretvaranja, proslijedite opciju -l:

Primjer izlaza podataka:

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

Za prikaz samo ID-ova procesa unesite:

Primjer izlaza podataka:

Zaustavite izvršavanje naredbi koje se izvode u pozadini

Da biste prisilno ili graciozno prekinuli proces, koristite naredbu kill. Sintaksa je sljedeća:

kill PID
ubiti -15 PID
ubiti -9 PID
killall proces-Ime-Ovdje
killall -15 proces-Ime-Ovdje
killall -9 proces-Ime-Ovdje

Vraćanje programa u prvi plan u Linuxu

Linux vam omogućava ne samo da pokrenete programe u pozadini, već i da ih vratite u normalno izvršavanje ako želite. Za to postoje dva alata: naredba ( Tim je grupa ljudi ujedinjenih zajedničkim motivima i interesima.) fg i % operator. Princip njihovog truda je krajnje jednostavan. fg zahtijeva specificiranje broja posla kao parametra i mora se zamijeniti za % odmah nakon operatora bez razmaka.

pronađi / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: zadatak je završen
+ Izlaz 1 find / -name .ini 2> ~/results.txt

U suštini, operativni sistem se sastoji od kernela i ogromnog skupa programa koji su dizajnirani da obavljaju različite zadatke, održavaju sistem i zadovoljavaju potrebe korisnika. Gotovo sva interakcija između korisnika i operativnog sistema odvija se kroz programe. Stoga je važno da početnici razumiju kako pokrenuti program na Linuxu, šta se dešava tokom pokretanja i koji su načini pokretanja.

Prije nego što pređemo na pokretanje programa, prvo moramo razumjeti šta je program. U Linuxu se programi razlikuju od drugih datoteka samo po tome što imaju postavljenu zastavicu za izvršavanje. O tome sam već detaljno pisao u članku, pa neću ponavljati.

Svi programi se mogu podijeliti u nekoliko tipova:

  • Binarni programi- sadrže instrukcije procesoru koje su spremne za izvršenje, većina programa je u ovom formatu, brzi su i sistem ih odmah izvršava;
  • Bytecode programi- to više nisu instrukcije procesora, već instrukcije određene virtuelne mašine koja ih može izvršiti; bez virtuelne mašine takve komande se ne mogu izvršiti. Takvi programi troše više resursa, ali su i prilično brzi, njihova prednost je što se mogu izvršavati bez modifikacija gdje god mogu raditi virtuelna mašina. Takvi programi uključuju Java programe.
  • Skriptni programi- ovi programi se sastoje od skupa komandi u običnom tekstu koje izvršava poseban interpreter. Takvi programi su sporiji, ali ih je lakše razviti i njihov kod se može lako i brzo mijenjati.

Sada pređimo na pokretanje programa.

Pokretanje programa u terminalu

U početku u operacionim salama Unix sistemi i Linux nije imao grafičko sučelje, pa su se programi pokretali pomoću komandi s terminala. Sada je to također moguće i prilično ga aktivno koriste iskusni korisnici. Sintaksa pokretanja programa izgleda ovako:

/put/do/datoteke/programa opcije

Parametri se specificiraju samo kada su potrebni, ali ljuska uvijek mora znati punu putanju do programa. Sve iza naziva programa i razmaka su parametri. Verovatno ste već primetili da obično ne navodimo punu putanju prilikom izvršavanja programa. To bi bilo jako dugo i nezgodno.

Programeri su smislili rješenje. Kreirana je varijabla PATH, koja čuva sve putanje do foldera u kojima se obično nalaze programi - /bin, /sbin, /usr/bin, /usr/sbin i tako dalje. Njegov sadržaj možete pogledati naredbom:

Kada upišete ime programa, sistem traži izvršnu datoteku sa tim imenom u svim fasciklama iz PATH i ako je pronađe, izvršava je. Ako takav fajl ne postoji, prikazuje se poruka “komanda nije pronađena”. Dakle, da biste pokrenuli neki od sistemskih programa, samo upišite njegovo ime izvršnu datoteku, Na primjer:

I možete proslijediti parametre nakon razmaka:

Kada se program ne nalazi u ovim direktorijima, morate navesti punu putanju do njega:

/usr/local/bin/ls1

Ako želite pokrenuti program putem ubuntu terminal, koji se nalazi u trenutnom folderu, onda će situacija biti malo drugačija. Sistem samo pretražuje fascikle u varijabli PATH; ne pretražuje trenutni direktorij. Stoga, ako upišete ime izvršne datoteke, dobićete grešku. Morate navesti punu putanju, kako se sećate da će biti./:

Ponekad postaje potrebno prenijeti neke posebne. Na primjer, varijabla EDITOR označava koja uređivač teksta treba koristiti kao zadanu. Možete navesti ime varijable i njenu vrijednost prije imena komande koristeći sintaksu:

varijabla_name = vrijednost naredbe

Na primjer:

EDITOR=nano visudo

Ova komanda podrazumevano otvara postavke u Vim editoru, ali sa ovim varijabla okruženja postavke će se otvoriti u nano editoru.

Pokretanje programa kao drugi korisnik

Već znate kako da pokrenete program linux terminal, šta je sa ostalim korisnicima? U Windows-u je prilično uobičajeno pokrenuti programe kao administrator kako bi program mogao dobiti više prava pristupa u sistemu. Na Linuxu se za to koristi sudo uslužni program. Njeno ime se može dešifrovati kao s vještica u ser uradi- promijeniti korisnika i izvršiti. Po defaultu, uslužni program pokreće naredbu kao root superkorisnik:

sudo komanda
sudo whoami

Ali koristeći opciju -u, možete pokrenuti program kao svaki korisnik prijavljen na sistem:

sudo -u naredba korisničkog imena
sudo -u postgres whoami

Komanda whoami (ko sam ja) prikazuje ime trenutnog korisnika.

Kako pokrenuti program u pozadini

Ponekad je potrebno pokrenuti dugotrajni program u terminalu kako ne bi ometao daljnji rad. Da biste to učinili, možete koristiti pokretanje programa u pozadini na Linuxu:

naziv_programa &

Na primjer:

dd if=/dev/nula od=~/broj datoteka=100000 &

Sistem će ispisati PID, jedinstveni identifikator programa, koji zatim možete koristiti da ga zatvorite:

Kako pokrenuti skriptu na Linuxu

Već smo rekli da se programi dijele na binarne i interpretirane. Ranije smo govorili samo o binarnim programima. Da biste pokrenuli interpretirane programe, potreban vam je direktno tumač; takvi programi uključuju one napisane na jezicima kao što su Java, Python, Perl, Ruby, PHP, NodeJS i mnogi drugi. Sintaksa za pokretanje takvog programa je drugačija:

tumač /put/do/datoteke/programa opcije

Različiti tumači se ponašaju različito, pa je bolje odmah navesti punu putanju do programa. Python obično preuzima skripte iz trenutnog foldera bez navođenja pune putanje:

python hellowrld.py

A Java programe treba pokrenuti ovako:

java -jar program.jar

Za interpretirane programske datoteke, oznaka izvršnosti je opciona, budući da se prosljeđuju kao parametar glavnom programu. Samo su Bash skripte izuzetak. Možete pokrenuti skriptu sa interpretatorom:

Ili samo upišite putanju do skripte:

Sama ljuska određuje svoje skripte pomoću oznake izvršnosti i izvršava ih. Ako zastavica izvršnosti nije postavljena, trebali biste je dodati:

sudo chmod u+x ./script.sh

Stoga su za većinu interpretiranih programa kreirane jednostavne sh skripte koje se mogu brzo pokrenuti.

Pokretanje Linux programa u GUI

Mnogo je zgodnije pokretati programe preko grafičkog interfejsa. Ako je nemoguće pokrenuti konzolne programe na ovaj način, postoje prečice za sve grafičke uslužne programe koje možete pronaći u glavnom meniju sistema:

Alternativno, možete pokrenuti program iz file manager, dvostrukim klikom miša, ali tada se za njega mora postaviti zastavica izvršnosti.

Pokretanje skripti grafički interfejs. Sve prečice menija možete pronaći u direktorijumu /usr/share/applications/. Svaki program se može pokrenuti dvostrukim klikom odavde. Ali hajde da vidimo šta se nalazi unutar prečice; da biste to uradili, otvorite je u uređivaču teksta:


Između ostalog, Exec linija specificira naredbu koja se izvodi linux programi kada dvaput kliknete na prečicu. Možete uzeti jednu od postojećih prečica i napraviti svoju na osnovu nje. Ovo je jednostavno naziv programa. Ali važno je napomenuti da je bolje navesti punu putanju na mjestima kao što su prečice, skripte, cron i tako dalje, to će smanjiti broj grešaka, jer ne možete znati da li sistem u ovom slučaju provjerava PATH ili traži program samo u trenutnom direktoriju. Sada znate sve o tome kako pokrenuti program na Linuxu.

zaključci

U ovom članku smo pogledali kako pokrenuti program preko ubuntu terminala ili u nekom drugom Linux distribucije. Iako se ovo čini kao vrlo jednostavna tema, postoje neke zanimljive stvari koje mogu biti korisne. Ali već znate za njih. Ako imate pitanja, pitajte u komentarima!