Sunteți pe pagina 1din 9

Ministère de l'éducation, de la culture et de la recherche

de la République de Moldova
Université technique de Moldavie
Faculté d’Ordinateur, Informatique et Microélectronique
Filière francophone “Informatique”

SOMIPP

Travail pratique nr.6


Thème: Gestion des processus sous GNU / Linux
OS

Effectué par l’étudiant(e) de gr FI-181 : Bonta Alexandr

Vérifié par le professeur : Colesnic Victor

Chișinau 2020
Scopul lucrării: studierea comenzilor destinate gestionării proceselor,
programarea timpului de start al proceselor, transferul și gestionarea datelor între
procese.

1) Creați și executați o singură dată script-ul (în acest script, nu puteți utiliza operatorul de
condiție și operatorii de control a proprietăților și valorilor), care va încerca să creeze directorul
test în directorul home. În cazul în care directorul va fi creat, script-ul va scrie în fișierul ~/raport
un mesaj "catalog test was created successfully" şi va crea în directorul test un fișier numit
Data_Ora_Lansarii_Scriptului. Apoi, indiferent de rezultatele etapei anterioare, script-ul trebuie să
interogheze, folosind comanda ping, adresa www.traiasca_moldova.md și în cazul în care host-ul
nu este disponibil, adăugați un mesaj de eroare în fișierul ~/raport (se recomanda - >,>>, ~, date, ||,
&&).

#!/bin/bash

chmod a+w /home/sasa


mkdir /home/sasa/test
cd /home/sasa
touch raport
echo 'catalog test was created successfully' >> /home/sasa/raport
cd /home/sasa/test
touch Data_Ora_Lansarii_Scriptului;
ping -c5 www.traiasca_moldova.md || echo 'Hostul nu este disponibil' >>
/home/sasa/raport

2) Modificați script-ul din 1) pentru încă o singură executare peste 2 minute. Controlați
conținutul fișierului ~/raport și afișați liniile noi apărute ( se recomanda – at, tail).

#!/bin/bash

sleep 120;
cd /home/sasa/lab6;
#cat '' > /home/sasa/raport
./ex1;
cat /home/sasa/raport | tail -n2
exit
3) Modificați script-ul din 1) ca să ruleze la fiecare 5 minute din oră, în zilele pare ale
săptămânii.

*/5 * * * .3.5 /home/sasa/lab6/ex1

4) Creați două procese de fundal care efectuează același ciclu infinit de calcul (de exemplu,
înmulțirea a două numere). După lansarea proceselor, prevedeți posibilitatea de a utiliza consolele
virtuale din care au fost lansate. Folosind comanda top, analizați procentul de utilizare a
microprocesorului de către aceste procese. Rezervați primului proces lansat o rată de utilizare a
resurselor microprocesorului nu mai mare de 20% (se recomanda – nice, kill).

#!/bin/bash

while true
do
a=$(shuf -i 0-100 -n 1)
b=$(shuf -i 0-100 -n 1)

#echo $a , $b;
c=$(($a*$b));
#echo $c
done
# top
# top –p nrProc

5) Procesul "Generator" transmite informații procesului "Handler" utilizând un fișier ascuns.


Procesul "Handler" trebuie să efectueze următoarele procesări asupra liniilor noi în acest fișier:
dacă linia conține un singur caracter "+", procesul "Handler" comută modul în adunare și așteaptă
introducerea datelor numerice. Dacă șirul conține un singur caracter "*", atunci procesul "Handler"
comută modul în înmulțire și așteaptă introducerea datelor numerice. În cazul când linia conține un
întreg, atunci procesul "Handler" execută operația curentă activă (modul activ curent) asupra
valorii variabilei calculate (curente) și valoarea recent introdusă (de exemplu, adună sau înmulțește
rezultatul calculat anterior cu numărul recent introdus). Când lansați script-ul, modul se va seta în
adunare, iar variabila calculată – în 1. Dacă este primit QUIT, script-ul afișează un mesaj despre
finalizare și finalizează activitatea. Dacă sunt primite alte valori, script-ul finalizează activitatea cu
un mesaj de eroare - date de intrare eronate.
GENERATOR ex5Gen.sh
#!/bin/bash

while true # Creem un ciclu infinit


do # In ciclu facem
read line # Citim linia
echo "$line" >> v_problem # Scrim linia citita in fisierul v_problem

if [[ "$line" == "QUIT" ]] # Daca linia introdusa este QUIT


then
exit 0 # Iesire cu codul 0
fi

if [[ ! "$line" =~ [0-9]+ && "$line" != "+" && "$line" != "*" ]] # Daca


linia nu este combinatie din orice cifre, + sau *. Operatorul =~ verifica daca sirul
din stanga coincide cu expresia regulata extinsa din dreapta
then
echo "Incorrect input :(" # Printam textul
exit 1 # Iesire cu codul 0
fi
done

Procesor
#!/bin/bash

touch v_problem # Cream fisierul v_problem


> v_problem # Redirectionarea iesiri spre fisier

num=1
mode="+" # Declaram modul de functionare initial

tail -n 0 -f v_problem | # Citim liniile nou introduse


while true # Cream un ciclu
do
read line # Citim linia
case $line in # Case dupa linie
"+") # Cazul linia = "+"
mode="+" # Trecem in modul de adunare
echo "Switched to the adding mode"
;; # ; in case, comenzile sunt executate secvential
"*") # Cazul linia = "*"
mode="*" # Trecem in modul de imnmultire
echo "Switched to the multiplying mode"
;; # ; in case, comenzile sunt executate secvential
"QUIT") # Cazul linia = QUIT
echo "Stopped by the QUIT input"
killall tail # Se finalizeaza procesul fiu tail

exit 0 # Iesire cu codul 0


;; # ; in case, comenzile sunt executate secvential
[0-9]*) # In cazul de repetitia orice combinatie din cifre
de 0 sau mai multe ori
case $mode in # Se alege in ce mod va functiona
"+") # Modul de adunare
echo "Adding" $num "and " $line
num=$(($num + $line)) # Adunam numarul care il avem cu
numarul introdus, numarul ia valoarea noua
echo "And getting " $num
;; # ; in case, comenzile sunt executate secvential
"*") # Modul de inmultire
echo "Multiplying" $num "and " $line
num=$(($num * $line)) # Inmultim numarul care il avem cu
numarul introdus, numarul ia valoarea noua
echo "And getting " $num
;; # ; in case, comenzile sunt executate secvential
esac # Sfarsit case
;; # ; in case, comenzile sunt executate secvential
*) # In orice alt caz
echo "Stopped by the INCORRECT input !!"
killall tail # Se finalizeaza procesul fiu tail
exit 1 # Iesire cu codul 0
;; # ; in case, comenzile sunt executate secvential
esac # Sfarsit case
done

6) Procesul "Generator" citește liniile de la consolă până când va fi introdus TERM. În acest
caz, acesta trimite un semnal de sistem SIGTERM procesului "Handler". Procesul "Handler" (ca
în exemplul, ce afișează, în buclă infinită, un număr natural în fiecare secundă) trebuie să
intercepteze semnalul de sistem SIGTERM și să finalizeze activitatea, afișând mesajul despre
finalizarea activității cu primirea semnalului de la alt proces.

Generator
#!/bin/bash

while true # Cream un ciclu infinit


do
read line # Citim linia
case $line in # Case dupa linie
TERM) # Cazul linia = TERM
kill -SIGTERM $(cat vi_problem) # Trimitem semnalul (-SIGTERM)
procesului. SIGTERM zice procesului sa se stanga. Obtinem $(...) indicatorul
procesului pe care il inchidem din fisier
exit 0 # Iesire cu codul 0
;; # ; pentru case. Comenzile se indeplinesc secvential
*) # Orice alt caz
continue # Se reincepe bucla
;; # ; pentru case. Comenzile se indeplinesc secvential
esac # Sfarsitul case
done

Procesor
#!/bin/bash

echo $$ > vi_problem # Scrim PID-ul procesului in fisier

cnt=0
running=1

handle() # Declaram functia handle fara parametri de intrare


{
running=0
}

trap 'handle' SIGTERM # trap permite sa prindem semnale si sa executam codul


cand apar semnale. Programul este terminat. Se defineste handlerul 'handle' care
activeaza la primirea semnalului SIGTERM
while (( running != 0 )) ; # Pana cand semnalul nu este ideplinit
do
((cnt=$cnt + 1)) #
sleep 1 # Fiecare secunda afisam un numar natural. Retinere 1
sec
echo $cnt #
done

echo "Stopped by SIGTERM signal"

7) Procesul "Generator" citește linii de la consolă în buclă infinită. Dacă linia citită conține un
singur caracter "+", procesul "Generator" trimite procesului "Handler" un semnal USR1. Dacă
linia conține un singur caracter "*", "Generator" trimite procesului "Handler" semnalul USR2.
Dacă șirul conține cuvântul TERM, "Generator" trimite un semnal SIGTERM procesului
"Handler". Alte valori ale liniilor sunt ignorate. Procesul "Handler" adună 2 sau multiplică cu 2
valoarea curentă a numărului procesat (valoarea inițială este 1) în funcție de semnalul primit de la
utilizator și afișează rezultatul pe ecran. Calcularea și afișirea sunt efectuate o dată pe secundă.
Primind semnalul SIGTERM, "Handler" își finalizează activitatea și afișează mesajul despre
finalizarea activității cu primirea semnalului de la alt proces.

Generator

#!/bin/bash

while true; # Cearam un ciclu infinit

do

read line # Citim linia

case "$line" in # Case dupa linie

TERM) # Cazul linie = TERM

kill -SIGTERM $(cat vii_problem) # Trimitem semnalul (-SIGTERM) procesului.


SIGTERM zice procesului sa se stanga. Obtinem $(...) indicatorul procesului pe care il
inchidem din fisier

exit # Se termina executia scriptului

;; # ; pentru case. Comenzile se indeplinesc secvential

+) # Cazul linia = "+"

kill -USR1 $(cat vii_problem) # Kill transmite semnal (USR1) procesului


cu PID $(...) din fisier.
;; # ; pentru case. Comenzile se indeplinesc secvential

[*]) # Cazul linia = "*"

kill -USR2 $(cat vii_problem) # Kill transmite semnal (USR2) procesului


cu PID $(...) din fisier.

;; # ; pentru case. Comenzile se indeplinesc secvential

*) # Orice alt caz

continue # Se reincepe bucla

;; # ; pentru case. Comenzile se indeplinesc secvential

esac # Sfarsitul case

done

Procesor

#!/bin/bash

echo $$ > vii_problem # Scrim PID-ul procesului in fisier

cur=1

mode="+" # Declaram modul de functionare initial

sigterm() # Declaram functia sigterm fara parametri de intrare

echo "Stopped by SIGTERM signal"

exit 0 # Iesim cu codul 0

user1() # Declaram functia user1 fara parametri de intrare

mode="+" # Trecem la modul +2

user2() # Declaram functia user1 fara parametri de intrare

mode="*" # Trecem la modul *2

trap 'sigterm' SIGTERM # Se defineste handlerul 'sigterm' care activeaza la


primirea semnalului SIGTERM
trap 'user1' USR1 # Se defineste handlerul 'user1' care activeaza la
primirea semnalului USR1

trap 'user2' USR2 # Se defineste handlerul 'user2' care activeaza la


primirea semnalului USR2

while true; # Cearam un ciclu infinit

do

case "$mode" in # Case dupa mode

+) # Cazul mode = "+"

cur=$(($cur + 2))

;; # ; pentru case. Comenzile se indeplinesc secvential

[*]) # Cazul mode = "*"

cur=$(($cur * 2))

;; # ; pentru case. Comenzile se indeplinesc secvential

esac # Sfarsit case

sleep 1 # Retinere 1 sec

echo "$cur" # Afisam valoarea lui $cur

done