bash et les commandes Gnu (suite)

publicité
Le système d'exploitation Debian Gnu/Linux
Master 1, RMSE
2015/2016
TP N◦ 5
bash et les commandes Gnu (suite)
Le TP porte sur :
la gestion des processus, et
la programmation shell, avec ou sans fonctions.
1
Les processus
1. Lancer le processus sleep 1000 en arrière-plan (backgound ) et récupérer son PID et le numéro de
job correspondant.
$ sleep 1000&
[3] 10117
Ici, le PID est 10117 et le numéro de job est 3 (le PID et le numéro de job varient bien entendu).
2. Replacer ce processus en avant-plan (foreground ), puis le stopper (sans le tuer!) et enn, le replacer
en arrière-plan.
$ fg sleep 1000
sleep 1000
^ Z ( CTRL - Z )
[3]+ Stoppé
$ bg 3
[3]+ sleep 1000 &
sleep 1000
3. Obtenir les détails de ce processus :
$ ps p 10117 -f
UID
PID PPID C STIME
TTY
STAT TIME CMD
etudiant 10117 2444 0 17:09 pts /1 S
0:00 sleep 1000
4. Modier la priorité de ce processus par un facteur égal à 10 :
$ renice 10 10117
10117: ( identifiant de processus ) priorité précédente 0 ,
nouvelle priorité 10
5. Lister à nouveau les détails de ce processus mais au format long. Noter la valeur de la colonne NI :
$ ps p 10117 -l
F S UID
PID PPID C PRI NI ADDR
SZ WCHAN TTY
TIME CMD
0 S 1000 10117 2444 0 90 10 2324 pts /1 0:00 sleep 1000
6. Envoyez le signal 15 à ce processus. Ceci va le terminer.
$ kill -15 10117
$
[3]+ Complété
2
sleep 1000
Programmation Shell :
Considérons un chier texte nombres.txt contenant les lignes suivantes :
1 3
5 7
12 19
...
1
On se propose d'écrire un script sommes.sh qui accepte ce chier comme argument, le lit et pour chacune
de ses lignes, calcule la somme des deux nombres et l'ache sous la forme suivante :
1 + 3 = 4
5 + 7 = 12
12 + 19 = 31
...
1. Placer la première ligne suivante indiquant le shell qui doit être utilisé pour interpréter le script :
#!/ bin / bash
2. Vérier ensuite que le nombre de paramètres passés au script est égal à 1 et que ce paramètre est
bien un chier.
[[ $ # - ne 1 ]] && { echo -e " Syntaxe :\ n \ t$0 < fichier >"; exit 1; }
[[ ! -f " $1 " ]] && { echo " Impossible de lire <$1 >"; exit 2; }
3. Le chier doit être lu ligne par ligne; écrire une boucle qui lit une ligne tant que la n du chier
n'est pas atteinte :
while read ligne
do
...
done < $1
4. Dans la boucle, récupérer les deux valeurs des lignes; le séparateur est l'espace. Placer les deux
valeurs dans les variables n1 et n2 :
while read ligne
do
n1 = $ ( echo $ligne | cut -d ' ' - f1 )
n2 = $ ( echo $ligne | cut -d ' ' - f2 )
...
done < $1
5. Additionner ces deux valeurs et placer le résultat dans une variable resultat, puis acher la valeur
de cette dernière.
Le script dans son ensemble sera donc comme suit :
#!/ bin / bash
[[ $ # - ne 1 ]] && { echo -e " Syntaxe :\ n \ t$0 < fichier >"; exit 1; }
[[ ! -f " $1 " ]] && { echo " Impossible de lire le fichier <$1 >"; exit 2; }
while read ligne
do
n1 = $ ( echo $ligne | cut -d ' ' - f1 )
n2 = $ ( echo $ligne | cut -d ' ' - f2 )
resultat = $ (( n1 + n2 ))
echo " $n1 + $n2 = $resultat "
done < $1
exit 0
6. Rendre le script exécutable :
$ chmod u + x sommes . sh
7. Lancer le script :
$ ./ sommes . sh nombres . txt
Il faut bien entendu avoir créé précédemment le chier nombres.txt.
2
3
Fonctions Shell
Un nombre est premier s'il a exactement deux diviseurs diérents : 1 et lui-même.
Le nombre 1 n'est pas premier car il n'a pas deux diviseurs diérents.
Le nombre 2 est premier (2 x 1 donc deux diviseurs diérents).
Aucun nombre pair (sauf 2) n'est premier (car ils sont tous divisibles par 2).
1. Écrire une fonction appelée est_premier, qui prend comme argument un nombre entier et qui
renvoie le code de retour 0 si le nombre est premier, 1 sinon.
est_premier ()
{
[[ $1 - lt 2 ]] && return 1
[[ $1 - eq 2 ]] && return 0
[[ $ (( $1 %2)) - eq 0 ]] && return 1
i =3
while [ $ (( i * i )) - le $1 ]
do
[[ $ (( $1 % i )) - eq 0 ]] && return 1
i = $ (( i +2))
done
return 0
}
2. Utiliser cette fonction dans un script premier.sh dont l'exécution se déroulera comme suit :
$ ./ premier . sh 21
21 n ' est pas un nombre premier
$ ./ premier . sh 23
23 est un nombre premier
3. Utiliser la même fonction dans un autre script premiers.sh qui ache tous les nombres premiers
inférieurs à 100.
3
Téléchargement