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