Exercise on Linux Shell Script (Bash)

Question 1

Préparation: récupérer le code source d’un porjet et dezipper le.

Par exemple apache-maven-3.5.0-src.zip depuis https://maven.apache.org/download.cgi

Ouvrer un terminal shell et aller dans le répertoire.

Question 2

  • Lister récursivement avec la command “find” les fichiers et répertoires.
  • Lister uniquement les fichiers (option “-f”)
  • Lister uniquement les fichiers avec le nom ‘*.java’ (attention, ‘*’ est un caractere special du shell)
  • Lister uniquement les fichiers avec le nom “*.java”, mais pas “*Test.java”
  • compter le nombre de fichers “*.java” mais pas “*Test.java”

Hints: utiliser les command “find . -f”, “wc -l”, “grep -v”

Question 3

  • Pour un fichier (java), afficher le nombre de ligne de code du fichier
  • Faire une boucle qui itere sur les fichiers et affiche pour chacun sa taille
  • faire une boucle qui somme le nombre total de lignes des fichiers
  • afficher seulement les 10 premieres lignes des des fichiers les plus gros avec leur taille

  • Facultatif: sans boucle mais avec la command “find . .. -exec .. \;”, afficher la liste de tous les fichiers et leur taille

Hints:

for f in $( find . ); do echo $f; done
cat $f | wc -l
linecount=$( .. )
sum=$(( $sum + $linecount ))
sort -n
head -10

Question 4

Faire un programme java qui affiche la liste des arguments du main

public class EchoMain {
  public static void main(String[] args) {
    for (int i = 0; i < args.length; i++) {
      System.ou.println("args[" + i + "]: '" + args[i] + "'");
    }
} 

L’executer depuis votre IDE (Eclipse, ..)

Question 5

Executer le programme en ligne de commande shell

java -cp bin EchoMain

L’executer avec des arguments internes java (-D, -X, …) et des arguments par exemple:

java -cp bin -Xmx100m -Xms100m -Dprop1=value1 EchoMain Hello World -Dprop2=value2 

Question 6

Faire un script shell pour executer le programme java avec les paramètres passés au shell

file “javaecho.sh”:

#!/bin/bash
java -cp bin EchoMain $@

Le rendre executable (“chmod u+x javaecho.sh”), et le tester

  • ./javaecho.sh Hello World

Les commandes suivantes fonctionnent-elles?

  • javaecho.sh Hello World
  • javaecho Hello World
  • ./javaecho Hello World
  • PATH=”$PATH:.”; javaecho.sh Hello World

Question 7

Tester (et expliquer) les résultats pour les paramètres suivant:

  • ./javaecho.sh Hello World
  • ./javaecho.sh Hello\ World
  • ./javaecho.sh “Hello World”
  • ./javaecho.sh “Hello\ World”
  • ./javaecho.sh ‘Hello World’
  • ./javaecho.sh ‘Hello\ World’
  • ./javaecho.sh *
  • ./javaecho.sh ‘*’
  • ./javaecho.sh *
  • ./javaecho.sh ‘*’
  • i=1; ./javaecho.sh $1
  • i=1; ./javaecho.sh “$1”
  • i=1; ./javaecho.sh ‘$1’
  • i=1; ./javaecho.sh $1

Question 8

Tester la difference avec @* au lieu de $@

script file “javaecho2.sh”:

#!/bin/bash
java -cp bin EchoMain $*

Question 9

Modifier le programme java pour rajouter a la fin “Thread.sleep(10000); System.ou.println(“exiting..);”

Pendant que le programme tourne (attend), vérifier que vous voyez le processus avec les command “ps”, “ps aux”, et “ls /proc/«pid»”

Question 10

Faire un script shell “monitor-javaecho.sh” qui relance le programme quand celui-ci s’arrete

Hints:

  • utiliser “$!” pour connaitre le pid du dernier process démarré par le shell
  • Faire un boucle toutes les secondes qui teste si le fichier “/proc/" exist
./javaecho.sh @$
pid=$!
...
if [ ! -e /prod/$pid ]; then
	echo "le process est arreté.. relancer le"
fi