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

Zadaci i procesi

Poziva se svaki program koji radi na Linuxu postupak. Linux kao multitasking sustav karakterizira činjenica da se mnogi procesi koji pripadaju jednom ili više korisnika mogu izvršavati istovremeno. Pomoću naredbe možete prikazati popis procesa koji se trenutno izvode p.s, na primjer, kako slijedi:

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

Napominjemo da prema zadanim postavkama naredba p.s prikazuje popis samo onih procesa koji pripadaju korisniku koji ga je pokrenuo. Da biste vidjeli sve procese koji se izvode u sustavu, morate izdati naredbu ps -a . Brojevi procesa(ID procesa ili PID), navedeni u prvom stupcu, jedinstveni su brojevi koje sustav dodjeljuje svakom pokrenutom procesu. Zadnji stupac pod naslovom COMMAND označava naziv naredbe koja se izvodi. U ovom slučaju popis sadrži procese koje je pokrenuo sam korisnik larry. Postoje mnogi drugi procesi koji se izvode u sustavu, oni puni popis može se vidjeti pomoću naredbe ps-pomoćni. Međutim, među naredbama koje pokreće korisnik larry postoji samo bash (komandna ljuska za korisnika larry) i sama naredba p.s. Bash ljuska se može vidjeti kako radi istovremeno s naredbom p.s. Kada je korisnik unio naredbu p.s, bash shell ga je počeo izvršavati. Nakon momčadi p.s završio s radom (prikazuje se tablica procesa), kontrola se vraća na bash proces. Tada bash shell prikazuje upit i čeka novu naredbu.

Također se naziva i pokrenuti proces zadatak(posao). Pojmovi proces i zadatak koriste se naizmjenično. Međutim, obično se proces naziva zadatkom kada to znači upravljanje poslom(kontrola poslova). Kontrola poslova značajka je naredbene ljuske koja korisniku daje mogućnost prebacivanja između više poslova.

U većini slučajeva korisnici će pokrenuti samo jedan zadatak - to će biti zadnja naredba koju su unijeli u naredbenu ljusku. Međutim, mnoge ljuske (uključujući bash i tcsh) imaju funkcije upravljanje poslom(kontrola posla), omogućujući vam pokretanje nekoliko naredbi u isto vrijeme ili zadaci(poslovi) i po potrebi prelaziti između njih.

Upravljanje poslom može biti korisno ako, na primjer, uređujete veliki tekstualna datoteka i želite privremeno prekinuti uređivanje kako biste izvršili neku drugu radnju. Možete koristiti značajke upravljanja poslovima da privremeno napustite uređivač, vratite se na odzivnik ljuske i izvršite druge radnje. Kada završe, možete se vratiti na rad s uređivačem i pronaći ga u istom stanju u kojem je bio ostavljen. Postoji mnogo više korisnih upotreba za funkcije upravljanja poslom.

Način rada u prvom planu i pozadini

Zadaci mogu biti bilo koji prvi plan(prednji plan), ili pozadina(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 unos s tipkovnice i šalje izlaz na ekran (osim, naravno, ako niste preusmjerili unos ili izlaz negdje drugdje). Protiv, pozadinski poslovi ne primaju ulaz od terminala; Tipično, takvi poslovi ne zahtijevaju interakciju korisnika.

Nekim je zadacima potrebno jako dugo da se dovrše i ništa se zanimljivo ne događa dok se izvode. Primjer takvih zadataka je prevođenje programa, kao i sažimanje velikih datoteka. Nema razloga buljiti u ekran i čekati da se ovi zadaci obave. Takve poslove treba pokrenuti pozadina. Za to vrijeme možete raditi s drugim programima.

Za kontrolu izvršavanja procesa u Linuxu postoji mehanizam prijenosa signali. Signal je sposobnost procesa da razmjenjuju standardne kratke poruke izravno koristeći sustav. Signalna poruka ne sadrži nikakve informacije osim signalnog broja (radi praktičnosti, umjesto broja može se koristiti ime koje je predefinirao sustav). Kako bi prenio signal, proces treba koristiti samo sistemski poziv ubiti(), a da biste primili signal, ne trebate ništa. Ako proces treba odgovoriti na signal na neki poseban način, može se registrirati rukovatelj, a ako nema rukovatelja, sustav će reagirati na to. Obično to uzrokuje trenutni prekid procesa koji je primio signal. Pokreće se rukovatelj signalima asinkrono, odmah po primitku signala, bez obzira na to što proces radi u tom trenutku.

Dva signala - broj 9 ( UBITI) i 19 ( STOP) - uvijek obrađuje sustav. Prvi od njih je potreban kako bi se sigurno ubio proces (otuda i naziv). Signal STOP obustavlja proces: u ovom stanju proces se ne uklanja iz tablice procesa, ali se ne izvršava dok ne primi signal 18 ( NASTAVAK) - nakon čega će nastaviti s radom. U Linux naredbenoj ljusci, signal STOP može se proslijediti aktivnom procesu pomoću izlazne sekvence Ctrl -Z .

Signalni broj 15 ( TERMIN) služi za prekid posla. Na prekid(prekid) proces posla umire. Poslovi se obično prekidaju escape sekvencom Ctrl -C. Ne postoji način da se obnovi prekinuti posao. Također biste trebali znati da neki programi presreću signal TERMIN(pomoću rukovatelja), tako da pritiskom na kombinaciju tipki Ctrl -C(o) ne može odmah prekinuti proces. To se radi kako bi program mogao uništiti tragove svog rada prije nego što 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 s jednostavan primjer. Pogledajmo naredbu yes, koja se na prvi pogled može činiti beskorisnom. Ova naredba šalje beskrajni niz nizova koji se sastoje od znaka y na standardni izlaz. Pogledajmo kako ova naredba radi:

/home/larry# da y y y y y

Niz takvih redaka nastavit će se beskonačno. Ovaj proces možete uništiti tako da mu pošaljete prekidni signal, tj. pritiskom na Ctrl -C. Učinimo stvari sada drugačije. Kako bismo spriječili da se ovaj beskonačni niz prikazuje 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 su izgubljeni. Korištenje 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, prompt ljuske se također ne vraća. To je zato što se naredba yes još uvijek izvodi i šalje svoje poruke koje se sastoje od slova y u /dev/null. Također možete uništiti ovaj zadatak slanjem signala prekida.

Sada recimo da želite da naredba yes nastavi raditi, ali i da se vrati odzivnik ljuske na ekran kako biste mogli raditi s drugim programima. Da biste to učinili, naredbu yes možete staviti 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. Naredbena 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 s ovim procesom (PID), a ovaj broj sustav također dodjeljuje procesu. Kao što ćemo vidjeti kasnije, procesu se može pristupiti navođenjem oba ova broja.

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

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

Vidimo da ovaj program stvarno radi. Kako biste saznali status zadatka, također možete koristiti naredbu p.s, kao što je prikazano gore.

Da bi se prenio signal procesu (najčešće postoji potreba prekinuti posao posao) koristi se pomoćni program ubiti. Ova naredba dobiva ili broj posla ili PID kao argument. Neobavezni parametar je broj signala koji treba poslati procesu. Prema zadanim postavkama signal se šalje TERMIN. U gornjem slučaju, broj posla je bio 1, pa je naredba ubiti %1će prekinuti posao. Kada se poslu pristupi njegovim brojem (a ne njegovim PID-om), tada tom broju mora prethoditi simbol postotka (“%”) u retku za naredbe.

Sada unesite naredbu radnih mjesta ponovo za provjeru rezultata prethodne akcije:

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

Zapravo, posao je uništen, a kada sljedeći put unesete naredbu poslovi, na ekranu neće biti nikakvih informacija o tome.

Također možete prekinuti posao pomoću identifikacijskog broja procesa (PID). Ovaj broj, zajedno s identifikacijskim brojem posla, naznačen je kada posao započne. U našem primjeru vrijednost PID-a bila je 164, pa je naredba ubiti 164 bilo bi ekvivalentno naredbi ubiti %1. Kada koristite PID kao argument za kill naredbu, ne morate unijeti znak "%".

Pauziranje i nastavak poslova

Prvo započnimo proces s naredbom yes u prvom planu, kao što je to učinjeno prije:

/home/larry# da > /dev/null

Kao i prije, budući da se proces izvodi u prvom planu, prompt ljuske se ne vraća na zaslon.

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

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

Obustavljeni proces jednostavno se ne izvršava. Ne troši resurse procesora. Obustavljeni zadatak može se pokrenuti s iste točke kao da nije bio obustavljen.

Da biste nastavili s radom u prednjem planu, možete koristiti naredbu fg(od riječi foreground - prvi plan).

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

Naredbena ljuska ponovno će prikazati naziv naredbe kako bi korisnik znao na kojem se zadatku nalazi. ovaj trenutak pokrenut u prvi plan. Pauzirajmo ponovno ovaj zadatak pritiskom na tipke Ctrl -Z, ali ovaj put ga pokrenimo u pozadinu s naredbom bg(od riječi background - pozadina). To će uzrokovati pokretanje procesa kao da je pokrenut pomoću naredbe s & na kraju (kao što je učinjeno u prethodnom odjeljku):

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

Vraća se prompt ljuske. Sada ekipa radnih mjesta mora pokazati da proces Da zapravo trenutno radi; ovaj se proces može prekinuti naredbom ubiti, kao što se radilo i prije.

Ne možete koristiti tipkovni prečac za pauziranje zadatka koji se izvodi u pozadini Ctrl -Z. Prije pauziranja posla potrebno ga je naredbom staviti u prvi plan fg pa tek onda prestati. Dakle, zapovijed fg može se primijeniti ili na obustavljene poslove ili na posao koji se izvodi u pozadini.

Postoji velika razlika između pozadinskih poslova i suspendiranih poslova. Obustavljeni zadatak ne funkcionira - na njega se ne troši novac računalna snaga procesor. Ovaj posao ne izvodi nikakvu radnju. Obustavljeni zadatak zauzima određenu količinu RAM-a računala; nakon nekog vremena kernel će ispumpati ovaj dio memorije u 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 izvode 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 beskrajni tok od y znakova biti ispisan na ekranu. Ova se nit ne može zaustaviti zbog kombinacije tipki Ctrl -C ne utječe na poslove u pozadini. Kako biste zaustavili ovaj izlaz, morate koristiti naredbu fg, koji će staviti zadatak u prvi plan, a zatim uništiti zadatak kombinacijom tipki Ctrl -C .

Napravimo još jednu napomenu. Obično timski fg i tim bg utjecati na one poslove koji su zadnji obustavljeni (ovi će poslovi biti označeni simbolom + pored broja posla ako unesete naredbu radnih mjesta). Ako se jedan ili više poslova izvodi u isto vrijeme, poslovi se mogu postaviti u prvi plan ili pozadinu navođenjem naredbi kao argumenata fg ili naredbe bg njihov identifikacijski broj (job ID). Na primjer, naredba fg %2 stavlja posao broj 2 na čelo i zapovjed bg %3 stavlja posao broj 3 u drugi plan. Koristite PID-ove kao argumente naredbe fg I bg Zabranjeno je.

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

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

Administriranje poslužitelja koji pokreće Linux često je popraćeno višestrukim manipulacijama naredbama u prozoru terminala. Ovo je poznata slika za one koji administriraju poslužitelje na Linuxu, au nekim slučajevima zgodno je pokretati naredbe u pozadini. Ovo bi se moglo koristiti u praksi, a vrijedno je primijetiti razloge zašto bi moglo biti korisno:
— Kada je terminal preopterećen hrpom poruka i nije moguće paralelno izvoditi dodatne radnje;
— Ako zatvorite terminal, trenutni proces i njegovi podređeni procesi prestaju;
Ovi se problemi mogu jednostavno riješiti; jednostavnim rječnikom rečeno, moramo potpuno odvojiti tekući proces od upravljačkog terminala.

U ovom ćemo postu pogledati korisnu mogućnost Linuxa za pokretanje naredbi u pozadini. Drugim riječima, proces koji pokrenete izvršit će se odvojeno od kontrolnog terminala.

Kako pokrenuti naredbe ili procese u pozadini
Ako se vaš proces izvodi u prozoru terminala, možete ga pauzirati pomoću naredbe Ctrl+Z, vjerojatno mnogi ljudi to znaju i pomislit će, pa što. I evo što je zanimljivo, nakon što smo tako obustavili proces, možemo ga nastaviti u pozadini, za to moramo unijeti naredbu

Nakon unosa ove naredbe, proces će se nastaviti, ali u pozadini. Za pregled svih procesa koji se izvode u pozadini, možete unijeti naredbu

Pogledajmo jednostavan primjer kako se to može primijeniti. Recimo da imamo , koji trebamo raspakirati, ali nemamo vremena čekati, a želimo raditi paralelno.

Raspakiranje arhive u pozadini

$ tar -czf home.tar.gz .

Klik Cntr+Z, zatim unesite naredbe

$bg$poslovi

Drugi način je dodavanje & na kraju naredbe, to će reći sustavu da pokrene naredbu u pozadini.

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

Ova metoda omogućuje rad procesa u pozadini, međutim, STDIN, STDOUT, STDERR su i dalje spojeni na terminal. Sada osigurajmo da se proces izvodi čak i kada je terminal zatvoren.

Izvršavanje procesa nakon zatvaranja prozora terminala
Da bi se proces nastavio izvoditi čak i nakon zatvaranja prozora terminala, možemo koristiti naredbu odreći se. On će "otkačiti" proces iz ljuske prozora terminala, nakon čega će se izvršiti čak i nakon zatvaranja prozora konzole.
Pogledajmo primjer korištenja standardne naredbe rsync, pokušajmo ga izvršiti u pozadini i prekinuti vezu procesa s terminalom.

$ 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 raditi čak i kada korisnik izađe iz ljuske sustava.

$ nohup tar -czf iso.tar.gz Predlošci/* & $ poslovi

Kako odvojiti proces od upravljačkog terminala Linuxa
Za potpuno odvajanje procesa od kontrolnog terminala, također možete koristiti naredbu koja će biti učinkovita kada koristite grafičko korisničko sučelje (GUI), na primjer, preglednik Firefox.

$firefox/dev/null &

U Linux sustav(i na gotovo svim Unix sustavima) /dev/null je posebna datoteka uređaja, koja se također naziva "null uređaj". Zapisivanje u nju uspješno se provodi, bez obzira na količinu snimljenih informacija, čitanje iz nje jednako je čitanju kraja datoteke (EOF).

Zadnji put smo govorili o radu s ulazom, izlazom i tokovima pogrešaka u bash skriptama, deskriptorima datoteka i preusmjeravanju toka. Sada već znate dovoljno da napišete nešto svoje. U ovoj fazi svladavanja basha, možda ćete imati pitanja o tome kako upravljati pokrenutim skriptama i kako automatizirati njihovo pokretanje.

Do sada smo u naredbeni redak upisivali nazive skripti i pritiskali Enter, što je uzrokovalo trenutno pokretanje programa, ali to nije slučaj. jedini način pozivanje skripti. Danas ćemo govoriti o tome kako skripta može raditi s Linux signalima, o različitim pristupima pokretanju skripti i upravljanju njima tijekom izvođenja.

Linux signali

U Linuxu postoji više od tri tuceta signala koje generira sustav ili aplikacije. Ovdje je popis najčešće korištenih, koji će vam svakako dobro doći pri izradi skripti naredbeni redak.
Signalni kod
Ime
Opis
1
SIGHUP
Zatvaranje terminala
2
SIGINT
Signal za zaustavljanje procesa od strane korisnika s terminala (CTRL + C)
3
SIGQUIT
Signal za zaustavljanje procesa od strane korisnika s terminala (CTRL + \) s ispisom memorije
9
SIGKILL
Bezuvjetni prekid 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 bez gašenja
19
SIGCONT
Nastavak izvršenja prethodno zaustavljenog procesa

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

Signal SIGINT uzrokuje privremeni prekid rada. Linux kernel prestaje dodjeljivati ​​procesorsko vrijeme ljusci. Kada se to dogodi, ljuska obavještava procese šaljući im signal SIGINT.

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

Slanje signala skriptama

Bash ljuska vam omogućuje slanje signala skriptama pomoću tipkovničkih prečaca. Ovo je vrlo zgodno ako trebate privremeno zaustaviti pokrenutu skriptu ili prekinuti njen rad.

Prekid procesa

Kombinacija tipke CTRL+C generira signal SIGINT i šalje ga svim procesima koji se izvode u ljusci, uzrokujući njihov prekid.

Pokrenimo sljedeću naredbu u ljusci:

spavati 100 dolara
Nakon toga dovršit ćemo njegov rad kombinacijom tipki CTRL + C.


Prekinite proces s tipkovnice

Privremeno zaustavljanje procesa

Kombinacija tipki CTRL + Z generira SIGTSTP signal koji obustavlja proces, ali ga ne prekida. Takav proces ostaje u memoriji i može se nastaviti s radom. Pokrenimo naredbu u ljusci:

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


Pauzirajte proces

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

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

Obustavljene poslove možete vidjeti sljedećom naredbom:

Ps –l


Lista zadataka

U stupcu S, koji prikazuje status procesa, T je prikazan za obustavljene procese. Ovo označava da je naredba ili obustavljena ili u stanju praćenja.

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

Njen poziv izgleda ovako:

Ubij ID procesa

Presretanje signala

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

Naredba trap omogućuje skripti da odgovori na signale koje bi inače obradila ljuska bez njezine intervencije.

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

#!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo Ovo je test skripta count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($ brojati + 1)) gotovo
Trap naredba korištena u ovom primjeru daje izlaz tekstualna poruka kad god otkrije signal SIGINT, koji se može generirati pritiskom na Ctrl + C na tipkovnici.


Presretanje signala

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

Možete presresti izlazni signal skripte korištenjem naziva EXIT signala kada pozivate trap naredbu:

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


Presretanje izlaznog signala skripte

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

Modifikacija presretnutih signala i otkazivanje presretanja

Za izmjenu signala koje presreće skripta, možete pokrenuti trap naredbu s novim parametrima:

#!/bin/bash trap "echo "Ctrl-C je zarobljen."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1) ) done trap "echo "Modificirao sam trap!"" SIGINT count=1 while [ $count -le 5 ] do echo "Druga petlja #$count" sleep 1 count=$(($count + 1)) done


Modifikacija presretanja signala

Nakon izmjene, signali će se obrađivati ​​na novi način.

Presretanje signala također se može poništiti jednostavnim izvršavanjem naredbe trap, dodajući joj dvostruku crticu i naziv signala:

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

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


Signal presretnut prije nego što je presretanje otkazano.

Prvi pritisak CTRL + C dogodio se u trenutku izvršavanja skripte, kada je presretanje signala bilo na snazi, tako da je skripta izvršila echo naredbu dodijeljenu signalu. Nakon što je izvršenje doseglo naredbu unhook, naredba CTRL + C radila je kao i obično, prekidajući skriptu.

Pokretanje skripti naredbenog retka u pozadini

Ponekad bash skriptama treba dugo da dovrše zadatak. Međutim, možda ćete morati moći normalno raditi na naredbenom retku bez čekanja da skripta završi. Nije to tako teško provesti.

Ako ste vidjeli popis procesa koje ispisuje naredba ps, možda ste primijetili procese koji se izvode u pozadini i nisu vezani za terminal.
Napišimo sljedeću skriptu:

#!/bin/bash count=1 while [ $count -le 10 ] do sleep 1 count=$(($count + 1)) gotovo
Pokrenimo ga navođenjem znaka ampersand (&) iza imena:

$ ./myscipt &
To će uzrokovati njegovo pokretanje kao pozadinski proces.


Pokretanje skripte u pozadini

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

Imajte na umu da, iako se skripta izvodi u pozadini, ona nastavlja koristiti terminal za ispis poruka u STDOUT i STDERR, što znači da će tekst koji ispisuje ili poruke o pogrešci biti vidljivi na terminalu.


Popis procesa

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

Što ako želite da skripta nastavi raditi nakon zatvaranja terminala?

Izvršavanje skripti koje ne izlaze nakon zatvaranja terminala

Skripte se mogu izvršavati u pozadinskim procesima čak i nakon izlaska iz sesije terminala. Da biste to učinili, možete koristiti naredbu nohup. Ova vam naredba omogućuje pokretanje programa blokiranjem SIGHUP signala poslanih procesu. Kao rezultat toga, proces će se izvršiti čak i kada izađete iz terminala u kojem je pokrenut.

Primijenimo ovu tehniku ​​prilikom pokretanja naše skripte:

Nohup ./myscript &
To je ono što će biti ispisano na terminalu.


Tim nohup

Naredba nohup odvezuje proces od terminala. To znači da će proces izgubiti reference na STDOUT i STDERR. Kako se ne bi izgubili izlazni podaci skripte, nohup automatski preusmjerava poruke koje stižu u STDOUT i STDERR u datoteku nohup.out.

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

Pregledajte zadatke

Naredba poslovi vam omogućuje pregled trenutnih poslova koji se izvode u ljusci. Napišimo sljedeću skriptu:

#!/bin/bash count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$(($count + 1)) done
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šnjim izvršavanjem naredbe jobs, vidjet ćemo informacije o obustavljenoj skripti i onoj koja se izvodi u pozadini.


Dobivanje informacija o skriptama

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

Ponovno pokretanje obustavljenih poslova

Za ponovno pokretanje skripte u pozadini, možete koristiti naredbu bg.

Pokrenimo skriptu:

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

$bg


bg naredba

Skripta sada radi u pozadini.

Ako imate više obustavljenih poslova, možete proslijediti broj posla naredbi bg za ponovno pokretanje određenog posla.

Za ponovno pokretanje posla u normalni mod koristite fg naredbu:

Planiranje pokretanja skripti

Linux nudi nekoliko načina za pokretanje bash skripti u određenom trenutku. To su naredba at i planer poslova cron.

Naredba at izgleda ovako:

U vrijeme [-f naziv datoteke].
Ova naredba prepoznaje mnoge formate vremena.

  • Standardno, označava sate i minute, na primjer - 10:15.
  • Korištenje indikatora AM/PM, prije ili poslije podneva, na primjer - 22:15.
  • Korištenje posebnih naziva kao što su sada, podne, ponoć.
Osim što može odrediti vrijeme u koje bi se posao trebao pokrenuti, naredba at također može proslijediti datum koristeći jedan od svojih podržanih formata.
  • Standardni format datuma u kojem se datum piše pomoću obrazaca MMDDGG, MM/DD/GG ili DD.MM.GG.
  • Tekstualni prikaz datuma, npr. 4. srpnja ili 25. prosinca, dok se godina može navesti, a možete i bez nje.
  • Snimanje kao sada + 25 minuta .
  • Pregled snimke sutra u 22:15.
  • Vrsta snimanja 10:15 + 7 dana.
Da ne ulazimo dublje u ovu temu, pogledajmo jednostavan slučaj upotrebe naredbe:

$ na -f ./myscript sada


Zakazivanje poslova pomoću naredbe at

Prekidač -M prilikom poziva na koristi se za slanje onoga čemu skripta ispisuje e-pošta, ako je sustav konfiguriran u skladu s tim. Ako se šalje elektronička pošta nije moguće, ovaj prekidač će jednostavno potisnuti izlaz.

Za pregled popisa poslova koji čekaju na izvršenje, možete koristiti naredbu atq:


Popis zadataka na čekanju

Brisanje poslova na čekanju

Naredba atrm omogućuje brisanje posla na čekanju. Prilikom pozivanja navedite broj zadatka:

$atrm 18


Brisanje posla

Pokretanje skripti prema rasporedu

Zakazivanje jednokratnog pokretanja skripti pomoću naredbe at može olakšati život u mnogim situacijama. Ali što ako trebate da se skripta izvršava u isto vrijeme svaki dan, jednom tjedno ili jednom mjesečno?

Linux ima uslužni program crontab koji vam omogućuje planiranje skripti koje je potrebno redovito pokretati.

Crontab radi u pozadini i na temelju podataka u takozvanim cron tablicama pokreće planirane poslove.

Da biste vidjeli postojeću tablicu cron poslova, koristite sljedeću naredbu:

$ crontab –l
Prilikom planiranja pokretanja skripte prema rasporedu, crontab prihvaća podatke o tome kada se posao treba izvršiti u sljedećem formatu:

Minuta, sat, dan u mjesecu, mjesec, dan u tjednu.
Na primjer, ako želite da se određena skripta pod nazivom naredba izvršava svaki dan u 10:30, to će odgovarati sljedećem unosu u tablici zadataka:

30 10 * * * naredba
Ovdje zamjenski znak "*" koji se koristi za polja dan u mjesecu, mjesec i dan u tjednu označava da cron treba pokrenuti naredbu svaki dan u mjesecu u 10:30.

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

30 16 * * 1 naredba
Numeriranje dana u tjednu počinje od 0, 0 znači nedjelja, 6 znači subota. Evo još jedan primjer. Ovdje će naredba biti izvršena u 12 sati svakog prvog dana u mjesecu.

00 12 1 * * naredba
Mjeseci su numerirani počevši od 1.
Kako biste dodali unos u tablicu, morate pozvati crontab s prekidačem -e:

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

30 10 * * * /home/likegeeks/Desktop/myscript
Zahvaljujući ovoj naredbi, skripta će se pozivati ​​svaki dan u 10:30. Ako naiđete na pogrešku "Resurs privremeno nedostupan", pokrenite donju naredbu 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 jednu od njih uzrokovat će njeno pokretanje svakog sata, dnevno, tjedno ili mjesečno.

Pokretanje skripti pri prijavi i pokretanju ljuske

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

$HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Za pokretanje skripte pri prijavi, postavite njen poziv u datoteku .bash_profile.

Što je s pokretanjem skripti kada otvorite terminal? Datoteka .bashrc pomoći će vam da to organizirate.

Rezultati

Danas smo razgovarali o pitanjima upravljanja životni ciklus skripti, razgovarali smo o tome kako pokrenuti skripte u pozadini, kako rasporediti njihovo izvršavanje. Sljedeći put pročitajte o funkcijama u bash skriptama i razvoju biblioteke.

Poštovani čitatelji! Koristite li alate za planiranje pokretanja skripti naredbenog retka prema rasporedu? Ako da, recite nam nešto o njima.

Usluga Linux terminala radi prema zadanim postavkama u načinu rada s jednim zadatkom. To znači da svaka lansirana ekipa blokira terminal dok se ne završi. Ovaj pristup nije prikladan kada se izvode programi koji zahtijevaju dugo vrijeme izvršenja. Ovaj problem može se riješiti na dva načina: otvorite dodatni prozor terminala i u njemu izvršite drugu naredbu ili koristite pozadinski način rada. Svi trenutni operativni sustavi, uključujući Linux, su multitasking, što znači mogućnost istovremenog izvršavanja više programa.

Kako mogu pokrenuti brigadu u pozadini tako da mogu odmah pristupiti sučelju naredbenog retka? Posada koja je bila prisiljena pokrenuti se naziva pozadinski proces. Pozadinski procesi nisu prikazani na ekranu. Na primjer, Apache HTTPD poslužitelj radi u pozadini za posluživanje web stranica. Možete staviti skriptu ljuske ili bilo koju naredbu u način rada niskog prioriteta. Zadatak (na primjer, posada ili skripta) može se staviti u pozadinu dodavanjem "&" na kraj naredbenog retka. Ova naredba stavlja naredbu u pozadinu i oslobađa prostor u terminalu. Tim koji radi u pozadini naziva se posao. Dok se pozadinska naredba izvodi, moguće je izvršiti bilo koju drugu naredbu. Sintaksa je sljedeća:

naredba & naziv-skripte & /put/do/naredbe arg1 arg2 & naredba-1 | naredba-2 arg1 & naredba-1 | naredba-2 -arg1 -arg2 >/put/do/izlaza &

Za pokretanje programa u pozadini bez blokiranja prozora terminala, morate koristiti poseban "&" instruktor. Postavite ovaj znak na sam kraj retka nakon navođenja naziva naredbe, opcija i ulaznih parametara. U opći pogled ovaj niz se može unijeti kao “naziv_naredbe -opcija ulazni_parametar &”.

ls ~/* > ~/testna-datoteka.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 “[broj_zadatka] identifikator_procesa” i zatražit će od vas da unesete novostvorenu naredbu.

Pronađite naredbe koje se izvode u pozadini u Linuxu

Pokrenite sljedeću naredbu:

Primjer ispisa 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 uz standardne castove, proslijedite opciju -l:

Primjer ispisa 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 ispisa podataka:

Zaustavite izvršavanje naredbi koje se izvode u pozadini

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

ubij PID
ubiti -15 PID
ubiti -9 PID
killall proces-Ime-Ovdje
killall -15 Naziv procesa-Ovdje
killall -9 Naziv procesa-Ovdje

Vraćanje programa u prvi plan u Linuxu

Linux vam omogućuje ne samo pokretanje programa u pozadini, već i njihovo vraćanje na normalno izvršavanje ako želite. Za to postoje dva alata: naredba ( Tim je skupina ljudi ujedinjenih zajedničkim motivima i interesima.) fg i operator %. Načelo njihovog napora je krajnje jednostavno. fg zahtijeva navođenje 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 završen
+ Izlaz 1 find / -name .ini 2> ~/results.txt

U suštini, operativni sustav sastoji se od jezgre i ogromnog skupa programa koji su dizajnirani za obavljanje različitih zadataka, održavanje sustava i zadovoljavanje potreba korisnika. Gotovo sva interakcija između korisnika i operativnog sustava odvija se kroz programe. Stoga je važno da početnici razumiju kako pokrenuti program na Linuxu, što se događa tijekom pokretanja i koje su metode pokretanja.

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

Svi programi mogu se podijeliti u nekoliko vrsta:

  • Binarni programi- sadrže instrukcije procesoru koje su spremne za izvođenje, većina programa je u ovom formatu, brzi su i sustav ih odmah izvršava;
  • Bytecode programi- to više nisu instrukcije procesora, već instrukcije određenog virtualnog stroja koji ih može izvršiti, bez virtualnog stroja takve se naredbe ne mogu izvršiti. Takvi programi troše više resursa, ali su i prilično brzi, prednost im je što se mogu izvršavati bez izmjena bilo gdje gdje mogu raditi virtualni stroj. Takvi programi uključuju Java programe.
  • Skriptni programi- ovi se programi sastoje od skupa naredbi u običnom tekstu koje izvršava poseban interpreter. Takvi programi su sporiji, ali ih je lakše razviti i kod im se lako i brzo mijenja.

Sada prijeđimo na pokretanje programa.

Pokretanje programa u terminalu

U početku u operacijskim dvoranama Unix sustavi i Linux nije imao grafičko sučelje pa su se programi pokretali pomoću naredbi s terminala. Sada je i to moguće i prilično ga aktivno koriste iskusni korisnici. Sintaksa pokretanja programa izgleda ovako:

/put/do/datoteke/programa opcije

Parametri se navode samo kada su potrebni, ali ljuska uvijek mora znati punu stazu do programa. Sve nakon naziva programa i razmaka su parametri. Vjerojatno ste već primijetili da obično ne navodimo punu putanju prilikom izvršavanja programa. Bilo bi jako dugo i nezgodno.

Programeri su smislili zaobilazno rješenje. Stvorena je varijabla PATH koja pohranjuje sve staze do mapa 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 naziv programa, sustav traži izvršnu datoteku s tim nazivom u svim mapama iz PATH-a i ako je nađe, izvršava je. Ako takva datoteka ne postoji, prikazuje se poruka "naredba nije pronađena". Dakle, za pokretanje jednog od programa sustava, samo upišite njegov naziv izvršna datoteka, Na primjer:

I možete proslijediti parametre nakon razmaka:

Kada se program ne nalazi u ovim direktorijima, trebate navesti punu stazu do njega:

/usr/local/bin/ls1

Ako želite pokrenuti program putem ubuntu terminal, koji se nalazi u trenutnoj mapi, tada će situacija biti malo drugačija. Sustav pretražuje samo mape u varijabli PATH; ne pretražuje trenutni direktorij. Stoga, ako upišete naziv izvršne datoteke, dobit ćete pogrešku. Morate navesti puni put, kako se sjećate./:

Ponekad postaje potrebno prenijeti neke posebne . Na primjer, varijabla EDITOR pokazuje koji uređivač teksta treba koristiti kao zadani. Možete navesti naziv varijable i njenu vrijednost prije naziva naredbe pomoću sintakse:

ime_varijable = naredba vrijednost

Na primjer:

EDITOR=nano visudo

Prema zadanim postavkama ova naredba otvara postavke u Vim editoru, ali s ovim varijabla okoline postavke će se otvoriti u nano editoru.

Pokretanje programa kao drugi korisnik

Već znate kako pokrenuti program linux terminal, što je s ostalim korisnicima? U sustavu Windows prilično je uobičajeno pokrenuti programe kao administrator kako bi program mogao dobiti više prava pristupa u sustavu. Na Linuxu se za to koristi uslužni program sudo. Njezino se ime može dešifrirati kao s vještica u ser čini- promijeniti korisnika i izvršiti. Prema zadanim postavkama, uslužni program pokreće naredbu kao root superuser:

naredba sudo
sudo whoami

Ali pomoću opcije -u možete pokrenuti program kao bilo koji korisnik prijavljen na sustav:

naredba sudo -u korisničko ime
sudo -u postgres whoami

Naredba whoami (tko 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:

program_name &

Na primjer:

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

Sustav će ispisati PID, jedinstveni identifikator programa, koji zatim možete koristiti za zatvaranje:

Kako pokrenuti skriptu na Linuxu

Već smo rekli da se programi dijele na binarne i interpretirane. Ranije smo govorili samo o binarnim programima. Za pokretanje interpretiranih programa potreban vam je izravno 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 ponašaju se drugačije, pa je bolje odmah navesti puni put do programa. Python obično preuzima skripte iz trenutne mape bez navođenja pune staze:

python hellowrld.py

A Java programe je potrebno pokrenuti ovako:

java -jar program.jar

Za interpretirane programske datoteke, oznaka izvršnosti nije obavezna, budući da se prosljeđuju kao parametar glavnom programu. Izuzetak su samo Bash skripte. Možete pokrenuti skriptu s tumačem:

Ili jednostavno upišite put do skripte:

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

sudo chmod u+x ./script.sh

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

Pokretanje Linux programa u GUI-u

Puno je praktičnije pokretati programe putem grafičkog sučelja. Ako je nemoguće pokrenuti programe konzole na ovaj način, onda postoje prečaci za sve grafičke uslužne programe koje možete pronaći u glavnom izborniku sustava:

Alternativno, možete pokrenuti program iz upravitelj datoteka, dvostrukim klikom miša, ali tada za njega mora biti postavljena oznaka izvršnosti.

Pokretanje skripti grafičko sučelje. Sve prečace izbornika možete pronaći u direktoriju /usr/share/applications/. Svaki program možete pokrenuti dvostrukim klikom odavde. Ali da vidimo što je unutar prečaca; da biste to učinili, otvorite ga u uređivaču teksta:


Između ostalog, redak Exec navodi naredbu koja se izvodi linux programi kada dvaput kliknete na prečac. Možete uzeti jedan od postojećih prečaca i napraviti svoj na temelju njega. Ovo je jednostavno ime programa. Ali važno je napomenuti da je bolje navesti puni put na mjestima kao što su prečaci, skripte, cron i tako dalje, to će smanjiti broj grešaka, jer ne možete znati da li sustav 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čke

U ovom smo članku pogledali kako pokrenuti program putem ubuntu terminala ili na neki drugi način Linux distribucije. Iako se ovo čini kao vrlo jednostavna tema, postoje neke zanimljive točke koje bi mogle biti korisne. Ali već znate za njih. Ako imate pitanja, pitajte u komentarima!