TP 1

Introduction

Ce travail pratique contient trois exercices à réaliser individuellement. Vous devrez remettre un fichier pour chaque exercice contenant les commandes correspondant aux exercices.

Pour réaliser les exercices vous aurez besoin de regarder les différentes commandes vues en cours (commandes et boucles) et dans l’atelier 3 (regardez les commandes du tableau). Vous DEVREZ aller consulter les pages de manuel des différentes commandes pour trouver la façon de réaliser ce que vous souhaitez.

Objectif

  1. Créer les scripts bash suivant:
    1. Script 1: afficher l’usage mémoire de Firefox
    2. Script 2: réparer des fichiers .java brisés
    3. Script 3: tester des serveurs à l’aide de ping

Note

  • Dans ce cours, un script est un fichier .sh contenant des commandes

Remise

  • Vous devez remettre et faire valider au courant des 2 prochaines séances.

  • À remettre sur Moodle:

    • Vos trois fichiers .sh
    • Vos trois captures d’écran
  • Captures d’écran:

    Fichier Contenu Annotations
    01_memoire.png Appel à memoire.sh et résultat Votre nom d'usager Linux
    02_tictactoe.png L'appel à ant run et la fenêtre du jeu tictactoe Votre nom d'usager Linux
    03_serveurs.png Appel à serveurs.sh Votre nom d'usager Linux

Astuce: créer un script bash de façon interactive

  1. Tester vos commandes dans un terminal
  2. Pour ajouter une comande au script, faire:
    • Remonter dans l’historique avec CTRL+P

      • (ou chercher avec CTRL+R
    • Une fois la commande trouvée:

      • Sélectionner avec la souris pour copier
      • Ouvrir vim
      $ vim mon_script.sh
      
      • Faire G pour aller à la fin du fichier
      • Faire o pour aller insérer une nouvelle ligne
      • Cliquer le bouton du milieu de la souris pour coller
      • Faire Esc pour quitter le mode insertion
      • Sauvegarder et quitter

Rappel de la théorie: expansion avant exécution

  • Par exemple, la ligne suivante:

    echo *
    
  • Va devenir cette ligne avant d’être exécutée:

    echo a.txt b.wav c.bin
    
  • La commande echo va recevoir 3 arguments, mais pas l’argument *

Rappel de la théorie: comment former une ligne de Bash

  • Pour l’instant, chaque ligne de Bash prend un de ces formes:

    1. Commande avec arguments
    $ cmd arg1 arg2 arg3 ...
    
    1. Sauvegarde de la sortie d’une commande dans une variable
    $ var=$(cmd ...)
    
      * **RAPPEL**: le résultat est stoqué sur une seule ligne
    
    1. Sauvegarde de la sortie d’une commande dans un fichier
    $ cmd ... > fichier        # nouveau fichier
    $ cmd ... >> fichier       # ajouter au fichier existant
    
    1. Répéter une commande pour chaque argument:
    $ for i in arg1 arg2 ...; do cmd $i; done
    
    1. Répéter une commande pour chaque ligne:
    $ ... | while read i; do cmd $i; done
    
  • À la place d’un argument, on peut utiliser une expension. Par exemple:

    1. Insérer tous les noms de fichiers qui correspondent à un patron
    *
    x?.java
    
1. Remplacer la variable par sa valeur
  $var
  
1. Utiliser le résultat d'une commande comme argument
  $(cmd ...)
  
1. Énumérer chaque éléments d'une séquence
  {1..9}
  {a..k}
  
1. Énumérer chaque éléments d'une liste
  {1,5,9}
  {a,h,k}
  
1. Énumérer chaque combinaisons
  {1..9}{a,h,k}
  

Commandes à considérer pour l’atelier

Commande Options / Exemples
ps

Affiche les processus actifs
-e ou -A affiche tous les processus
-o INFO1,INFO2,... affiche les INFO1 INFO2, etc.

faire man ps et chercher pour %cpu pour la liste des INFO
grep MOT FICHIER

Cherche les lignes du FICHIER où le MOT apparaît
-i ignore la casse (majuscule/minuscule)
-v renverse la recherche
cut FICHIER

Retourne une ou plusieurs colonnes d'un fichier
-d"DELIMITEUR" indique le DELIMITEUR à utiliser
-fCOLA,COLB,COLC,... conserver les colonnes COLA, COLB, COLC, etc.

P.ex. -f1,3 pour conserver les colonnes 1 et 3
echo ARG1 ARG2 ...

Affiche une liste de valeurs
-n Tout afficher sur la même ligne
cat FICHIER1 FICHIER2 ...

Affiche les fichiers
-n Afficher des numéros de ligne
bc CALCUL

Interprète les commandes du fichier CALCUL
(40.0 + 60.1 + 45.0) / 3 * 100 Un calcul
quit quitter bc
pwd

Affiche le répertoire courant
 
basename FICHIER

Affiche le nom du FICHIER, sans afficher le chemin complet
-s SUFFIXE N'affiche pas le SUFFIXE

P.ex. -s .java n'affiche pas l'extension d'un fichier java
-a FICHIER1 FICHIER2 ... Accepte plusieurs arguments
sed "COMMANDE"

Modifie du texte selon la COMMANDE
"s/foo/bar/g" Remplace foo par bar
"NiFOO" Se déplace à la ligne N et insère la chaîne FOO

P.ex. "1iBonjour!" insère Bonjour! au début du texte
-i FICHIER Modifie le FICHIER
ping SERVEUR

Teste la connexion vers un serveur
-c NBenvoie seulement NB nombre de ping

Travail à effectuer

Script 1: afficher l’usage mémoire de Firefox

Préambule

  1. Installer bc
$ sudo yum install -y bc
  1. Au besoin, démarrer Firefox

Script à écrire

  1. Créer le script memoire.sh qui va calculer l’usage mémoire de Firefox (en pourcentage de la mémoire totale):
    1. Lister les processus avec leur usage mémoire (en pourcentage)
    2. Chercher dans cette liste les lignes qui contiennent le mot firefox
    3. Utiliser seulement la colonne qui affiche l’usage mémoire
    4. Afficher chaque élément de la liste en ajoutant un +
    5. Ajouter un 0 à la fin de la liste
    6. Ajouter quit sur une nouvelle ligne
    7. Faire le calul

Capture d’écran

  1. Faire l’appel:
$ bash memoire.sh
capture 01_memoire.png
contenu: appel à memoire.sh et résultat
annotation: votre usager Linux





Script 2: réparer des fichiers .java

Préambule

  1. Installer ant
$ sudo yum install -y ant
  1. Télécharger et décompresser trois projets Java:
$ wget http://gyoukou.ca/jeux.tar.gz
$ tar zxvf jeux.tar.gz
$ cd jeux
  1. Les fichiers .java de ces projets on perdus leur première ligne, qui est de la forme package REPERTOIRE;

  2. Conséquemment, on ne peut pas les exécuter. Par exemple:

$ cd jeu_memoire
$ ant run               # oups

Script à écrire

  1. Écrire le script java.sh qui va ré-insérer la ligne package REPERTOIRE; pour chaque fichier .java d’un REPERTOIRE

    • P.ex. le fichiers .java du répertoire jeu_memoire devrait commencer par la ligne package jeu_memoire;
  2. Pour réparer chaque projet, vous devez exécuter votre script dans le répertoire jeux:

$ cd jeux
$ cp ~/java.sh .
$ bash java.sh
  1. Tester que vous avez réparer chaque projet, p.ex:
$ cd jeu_memoire
$ ant clean
$ ant build
$ ant run
capture 02_tictactoe.png
contenu: L'appel à ant run et la fenêtre du jeu tictactoe
annotation: votre usager Linux





Script 3: Tester des serveurs en parallèle

Préambule

  1. Assurez-vous d’avoir fait et remis l’atelier 6

Script à écrire

À inclure au début du script

serveurs="google.com youtube.com facebook.com"

Spécification

  1. Utiliser la commande ping -c2 SERVEUR pour vérifier qu’un serveur est actif

  2. Pour chaque serveur, afficher si le serveur est actif ou non

  3. (aucun autre affichage)

Exemple de sortie (tous actifs)

Vérification de google.com youtube.com facebook.com

google.com    est actif
youtube.com   est actif
facebook.com  est actif
capture 03_serveurs.png
contenu: L'appel à serveurs.sh
annotation: votre usager Linux