Exercices unix : pagination - système de fichier - synchronisation

Exercice 1: Pagination et va-et-vient disque

Dans un système d’exploitation utilisant une mémoire virtuelle paginée, il existe des situations où le gestionnaire mémoire est forcé de transférer des pages “victimes” depuis la mémoire physique vers le disque pour satisfaire des demandes d’allocation ou de chargement de pages.

Question 1 Lorsqu’une telle page victime est choisie pour être évincée de la mémoire, rappelez dans quelle(s) situation(s) sont contenu doit être enregistré sur le disque.

Question 2 Sur une machine multiprocesseurs, décrivez comment le système peut éviter que les différents processeurs n’accèdent a une page qui est en cours de transfert vers le disque.

Exercice 2: Système de fichiers Unix

Gestion des I- nœuds

On considère un processus P dont l’exécution démarre par l’ouverture (en mode écriture + création) d’un fichier ”toto” (sur le disque local) et se poursuit par de multiples écritures incrémentales dans ce fichier (au moyen de l’appel système write).

Question 1 Que se passe-t-il si, depuis le shell, on détruit l’entrée ”toto” (au moyen de la commande rm) pendant l’exécution de P ? Expliquez précisément pourquoi.

Question 2 On suppose maintenant que l’entrée ”toto” a été détruite (cf question précédente) puis recréée (par exemple avec cp /dev/null toto) pendant l’exécution de P. Que se passe-t-il du point de vue de P ? Expliquez en rappelant la manière dont Unix gère les I-nœuds en mémoire/sur disque.

Position courante dans un fichier

Voici un petit programme ecrire.c écrivant quelques entiers dans un fichier :

12345678910int main(int argc, char **argv) {int i, fd;fd = open(argv[1], O_WRONLY);for(i = atoi(argv[2]); i 10; i += 2) {lseek(fd, i * sizeof(int), SEEK_SET);/* SEEK_SET spécifie un positionnement par rapport au début du fichier */ write(fd, &i, sizeof(int));sleep(1);} close(fd);}

En supposant l’existence initiale d’un fichier vide nommé fichier, que va contenir ce fichier si l’on exécute les commandes “ecrire fichier 0” et “ecrire fichier 1” l’une après l’autre?

Et si l’on exécute les deux commandes de manière concurrente? Expliquez.

Exercice 3 Synchronisation

Un étudiant a implante une simulation de trafic automobile a une intersection (entre deux voies) munie de feux tricolores. Cette simulation s’appuie sur deux programmes UNIX : carrefour et voiture. Un seul processus exécute le programme carrefour; il a pour tâche de gérer le régime des feux et il est lance en tout début de simulation. Les autres processus de la simulation (peu importe le nombre) exécutent le programme voiture en parallèle. Tous les processus ont accès a une zone commune de mémoire partagée, qui contient les variables suivantes :

12345boolean peux_passer = TRUE;int sens_actif = 1; /* 1 ou 2 */int voitures_engagées = 0; /* nombre de voitures en train detraverser le carrefour */

Voici le code du programme carrefour :

1234567while(1) {sleep(PERIODE_REGIME);peux_passer = FALSE;while(voitures_engagées > 0) /* rien */ ;sens_actif = 3 - sens_actif; /* inversion du sens */ peux_passer = TRUE;}

Et voici le code du programme voiture :

1234int sens = tirage_aleatoire_du_sens();while(!peux_passer || sens != sens_actif) /* rien */ ; voitures_engagées++;sleep(TEMPS_TRAVERSEE); voitures_engagées--;

En résume, une voiture qui veut traverser dans le sens i s’arrête si sens actif = i (feu rouge) ou si sens actif =6 i mais peux passer = FALSE (feu orange); passe sinon (feu vert).

Question 1 Cette simulation va-t-elle solliciter intensivement le ou les processeur(s) de la machine sur laquelle elle va s’exécuter ? Expliquez pourquoi.

Question 2 Montrez que la programmation de la simulation telle que décrite ci-dessus risque d’aboutir a des accidents, c’est-à-dire a des situations où plusieurs voitures s’engagent simultanément dans des sens différents.

Question 3 Corrigez donc le protocole en introduisant des sémaphores (et peut-être d’autres variables) partages et en modifiant les programmes. Profitez de l’occasion pour éviter l’utilisation des boucles d’attente active. N’oubliez pas de préciser les valeurs initiales.

Question 4 Pour que la simulation soit plus réaliste, on se propose d’ajouter un nouveau type de programme (véhicule prioritaire) matérialisant des véhicules d’urgence (pompiers, samu) qui sont toujours prioritaires aux intersections. Lorsqu’un tel véhicule arrive aux abords de l’intersection, il actionne une sirène qui dissuade les autres véhicules d’entreprendre la traversée du carrefour, puis attend que les voitures déjà engagées terminent leur traversée, et enfin traverse sans s’occuper de la couleur du feu.

Etendez le protocole précédent et donnez le code du programme véhicule prioritaire de manière a observer le comportement ci-dessus dans la simulation. Dans cette question, on supposera qu’il n’advient jamais que deux véhicules prioritaires se rencontrent a un carrefour.

Question 5 Même question avec cette fois-ci une probabilité non-nulle que des véhicules non-prioritaires se croisent. Dans ce cas, c’est celui bénéficiant du feu vert qui passe...

Exercices sur la config conscrits - Interface

Exercice 1 : menus du fond

1.  Ouvrir une nouvelle fenêtre.
2.  Ouvrir une nouvelle fenêtre par un autre moyen.
3.  Fermer ces deux fenêtres.

Exercice 2 : souris et menus des fenêtres

1.  Ouvrir une fenêtre gamma.
2.  La déplacer dans le coin supérieur gauche de l'écran.
3.  Iconifier cette fenêtre.
4.  La faire réapparaître.
5.  Agrandir la fenêtre.
6.  Fermer la fenêtre gamma.

Exercice 3 : manipuler plusieurs fenêtres

1.  Ouvrir deux fenêtres quelconques.
2.  Placer l'une des fenêtres au dessus de l'autre.
3.  Faire passer au dessus celle qui se trouve en dessous. De quels moyens différents disposez-vous pour cela ?

Exercice 4 : écrans virtuels

1.  Lancer Mozilla.
2.  Déplacer la fenêtre de Mozilla dans un autre écran pour libérer celui où vous vous trouvez.
3.  Dans un troisième écran, ouvrez une fenêtre quelconque.
4.  Cliquez sur le second bouton à gauche d'un xterm, et déplacez-vous dans les écrans virtuels; que se passe-t-il ?

Exercice 5 : Mozilla

1.  Allez dans l'écran où se trouve Mozilla.
2.  Quelles sont les différentes façons de lancer Mozilla ?
3.  Que se passe-t-il quand vous cherchez à lancer deux Mozilla en même temps ?
4.  Trouvez le moyen d'ouvrir un second navigateur à partir du premier. Comment fait-on pour refermer cette fenêtre sans quitter Mozilla ?
5.  Quitter Mozilla.

  1. Vous pouvez par exemple cliquer sur le bouton «Fenetre».

  2. En cliquant avec le bouton gauche ou le bouton de droite de la souris sur le fond d'écran, vous faites apparaître un menu, sur lequel vous sélectionnez «Fenêtre».

    Vous pouvez aussi lancer des fenêtres au clavier. Vous voulez une nouvelle fenêtre terminal, gérée par l'interface graphique «X» : vous tapez

    xterm

    Bien sûr, il faut mettre une esperluette (&) après xterm pour récupérer la main dans le terminal où l'on a lancé la commande.

  3. .

    Une fenêtre est un support pour le programme qui tourne dedans. Quand vous quittez le programme, la fenêtre disparaît. En général, quand vous voulez quitter quelque chose, essayez «q» ou «Q», «^C» et «^D». Les commandes pour quitter les programmes les plus courants sont les suivantes :

muttq (quit)
pineq (quit)
joe^KX (quitter en sauvant)
vi(m):wq (write quit)
(x)emacs^X^S^X^C (save et cancel)
mozilla^Q ou sélectionner Exit dans le menu File
forumq (quit)
less, moreq (quit)
xdviTaper q ou cliquer sur Quit
gv (GhostView)^Q ou sélectionner Quit dans le menu File
  1. Et pour fermer une simple fenêtre terminal ? Il y a aussi un programme qui tourne dedans, appelé le shell : c'est lui qui interprète les lignes de commandes et les exécute. Il se quitte en tapant exit ou ^D.

    Par opposition avec les autres programmes, le shell peut aussi se quitter en cliquant avec n'importe quel bouton sur le bouton dans le coin en haut à gauche de la fenêtre et en choisissant Fermeture, puis Je veux vraiment quitter, dans le menu qui se déroule. Ceci revient à exécuter la commande exit.

    Si vous fermez la fenêtre sans quitter le programme qui tournait dedans, vous ôtez d'un seul coup son support à ce programme, qui est obligé de se suicider en urgence ; inutile de dire qu'il ne l'apprécie guère.

    Attention 

    Les choses se passent particulièrement mal avec pine : c'est pendant la seconde qui s'écoule entre le moment où vous tapez q et le moment où pine finit effectivement, que tous les rangements s'effectuent réellement et sont inscrits sur le disque : copies de sauvegardes des courriers envoyés, destructions, etc. Si vous le tuez au lieu de le quitter, vous vous exposez à diverses représailles : copie de votre mail-box en lecture publique sur votre compte, disparition de courrier, second Pine tournant en parallèle et vous empêchant de lire votre courrier la fois suivante, etc. Ce ne sont pas des inventions : tous ces cas ont été constatés.

  1. Utilisez le menu du bouton «Menu», ou faites-le apparaître en cliquant sur le fond de l'écran. Sélectionnez Terminaux et cliquez sur Nouvelle fenêtre Gamma.

    Vous pouvez aussi l'appeler au clavier en tapant :

    xterm -name gamma &

  2. Cliquez avec le bouton de gauche sur la barre de titre de la fenêtre et déplacez-là à l'endroit voulu. Vous pouvez aussi cliquer dans le menu du bouton gauche de la fenêtre, sélectionner Déplacement et mettre la fenêtre où bon vous semble.

  3. Cliquez sur le troisième bouton à partir de la droite (triangle vers le bas) pour minimiser la fenêtre (on n'en garde que la barre de titre). Pour la faire revenir à sa taille normale, cliquer à nouveau sur ce bouton. Vous pouvez aussi sélectionner Minimiser dans le menu de la première case à gauche.
  4. Cliquez à nouveau sur le bouton de l'exercice précédent (troisième bouton à partir de la droite, reconnaissable à un triangle vers le bas) pour faire réapparaître la fenêtre. Vous pouvez également sélectionner Restauration après avoir cliqué dans le menu de la première case à gauche.

    Pour faire consulter la liste des fenêtres que vous avez ouvertes, vous pouvez cliquer avec le bouton de gauche sur le fond de l'écran.

    Quelle différence y a-t-il entre fermer une fenêtre et icônifier une fenêtre? Quand vous fermez une fenêtre, vous mettez fin au programme qui tourne dedans (ou plus exactement, comme on l'a vu plus haut, mettre fin au programme ferme la fenêtre). Quand vous icônifiez une fenêtre, vous ne faites que suspendre temporairement l'affichage; une fois la fenêtre revenue, vous reprenez là où vous en étiez.


  5. Trois possibilités.
    1. La plus simple : cliquer sur le bouton avec une flèche vers le haut à droite : il fait passer la fenêtre en plein écran (cliquez-le à nouveau pour revenir à la taille normale). Vous pouvez également cliquer sur le bouton avec une flèche vers le haut pour agrandir au maximum la fenêtre juste verticalement (cliquez à nouveau sur ce bouton pour redonner à la fenêtre sa taille normale).
    2. Attraper le bord ou le coin de la fenêtre (attention, passage technique !), cliquer avec le bouton gauche et modifier la taille de la fenêtre.
    3. Cliquer sur le menu du coin, sélectionnez Dimensionner et donner à la fenêtre la taille souhaitée.

    Les programmes en mode texte (comme pine ou l'ensemble des éditeurs) sont prévus pour fonctionner en 80 colonnes. Élargir la fenêtre ne sert donc à rien, la fonte ne sera pas plus grande pour autant.


  6. Tapez exit ou ^D. Ou encore, dans le menu du bouton de la fenêtre en haut à gauche, sélectionner Fermeture et confirmez. Si vous n'êtes pas dans un xterm, il suffit de cliquer sur le bouton avec un éclair (en haut à droite de la fenêtre). Dans tous les cas, n'oubliez pas de quitter convenablement tous les programmes (pine, etc.) que vous aviez lancés dans ladite fenêtre (chaque programme a sa manière propre d'être quitté).

  1. Voir dans l'exercice 1 toutes les manières d'ouvrir des fenêtres...

  2. Cliquez avec le bouton de gauche la barre de titre de l'une des fenêtres pour la déplacer, et placez-la au dessus de l'autre. Autre possibilité : cliquer sur le bouton de gauche la barre de titre avec le bouton gauche de la souris et choisissez «devant». Ou encore : cliquez sur le fond d'écran avec le bouton gauche de la souris et sélectionnez la fenêtre qui vous intéresse dans la liste, toujours avec le bouton de gauche.
  3. Beaucoup ! Par exemple :

    1. Si on peut en atteindre un bout, cliquez avec le bouton de gauche de la souris sur la barre de titre de la fenêtre de dessous ;
    2. Si on peut placer la souris sur un endroit quelconque de la fenêtre, le faire, et appuyer sur la touche Front (disponible uniquement sur les claviers des stations Sun) ;
    3. Cliquez avec le bouton de droite de la souris sur la barre de titre de la fenêtre de dessus pour la faire passer derrière ;
    4. Cliquez sur le fond d'écran avec le bouton gauche de la souris pour faire apparaître la liste qui affiche le nom de vos fenêtres, cliquez sur le nom de la fenêtre à faire passer devant ;
    5. Utilisez le pager (voir exercice suivant) : cliquez avec le bouton du milieu sur l'image de votre fenêtre pour la faire passer devant.

  1. Cliquez sur le bouton Web ou sélectionnez Mozilla dans le menu du fond.
  2. En haut à gauche de l'écran, vous avez une sorte de petit tableau partagé en six cases; dans l'une d'entre elles se trouvent plusieurs autres petites cases. Ce tableau représente en fait l'ensemble de votre bureau; par exemple :

Les petites cases représentent chacune un bureau virtuel, et les petites cases de couleur qui sont dedans sont des modèles des fenêtres que vous avez ouvertes; la fenêtre dans laquelle vous vous trouvez est de la couleur des fenêtres activées. La case représentant le bureau où vous vous trouvez est d'une autre couleur que les autres.
Cliquez maintenant sur une des cases : votre écran est soudain très vide, vos fenêtres ont disparu, restent l'horloge, quelques boutons et ce tableau appelé pager.
  1. Pour y déplacer le Mozilla que vous venez de lancer, utilisez la souris : cliquez avec le bouton du milieu sur la petite case qui représente le fenêtre de Mozilla et faites-là glisser sur la case où vous vous trouvez; la fenêtre Mozilla va alors apparaître.

    Pour vous déplacer d'écran virtuel en écran virtuel, vous avez deux solutions : cliquer sur la case correspondante du pager, ou utiliser les flèches du pavé central, associées à la touche méta (les touches avec un losange noir ou blanc à côté de la barre d'espace).

  2. Allez dans un autre écran virtuel et ouvrez une nouvelle fenêtre. Si vous jetez un coup d'oeil au pager, vous voyez que trois des bureaux sont occupés : l'un par la fenêtre de départ, l'autre par Mozilla, l'autre par la toute dernière fenêtre ouverte.

    L'intérêt des écrans virtuels vient de ce qu'ils permettent de ne pas empiler dans un même espace plusieurs fenêtres (un texte que l'on tape, un dvi, un Mozilla, un jeu, du mail, etc).

  3. Le xterm se déplace «avec vous» : il ne reste pas dans l'écran virtuel où il se trouvait. En fait, le second bouton rend la fenêtre «sticky», comme le sont les boutons ou la console; ils sont affichés en permanence, quel que soit l'écran virtuel dans lequel vous vous trouvez. Les fenêtres sticky ont leur barre de titre rayée, et non pas lisse.


  1. Cliquez sur la petite fenêtre Mozilla dans le pager, ou utilisez méta-flèche pour vous déplacer dans les écrans virtuels.
  2. Avec la config conscrits, vous disposez d'un bouton «Web» dans la barre des boutons. Vous pouvez aussi appeler Mozilla au clavier, en tapant

    drakkar ~ $ mozilla &

    L'esperluette (&) demande à ce que le nouveau programme que vous lancez (ici Mozilla) soit mis en tâche de fond : vous récuperez donc le prompt immédiatement, et votre fenêtre terminal est à nouveau disponible pour d'autres commandes.

    Cette façon de lancer un navigateur est très utile, car vous pouvez lui donner une URL en argument.

    drakkar ~ $ mozilla http://www.eleves.ens.fr/tuteurs/ &

  3. Une fenêtre apparaît pour vous demander de créer un nouveau profil. En effet, chaque profil ne peut correspondre qu'à un seul Mozilla. Cliquez sur Exit et trouvez un autre moyen de lancer un second navigateur...

  4. Regardez dans les menus de Mozilla : dans le menu File, vous trouvez Navigator Window dans le sous-menu New>. C'est ce qui vous intéresse. Sélectionnez ce choix pour obtenir un second navigateur; vous pouvez aussi utiliser un raccourci clavier : Ctrl-N.

    Pour fermer un nouveau navigateur sans quitter Mozilla, il faut sélectionner Close (Ctrl-W) dans le menu File.

    Quelle différence y a-t-il entre lancer deux Mozilla à la fois et ouvrir une seconde fenêtre Mozilla à partir de la première ? Dans le premier cas, vous lancez deux fois le même programme en prenant donc ainsi deux fois plus de ressources machine; de plus, vous perdez la possibilité d'utiliser les données (historique, marque-pages...) de la première session.

    Si par contre vous lancez une seconde fenêtre à partir du premier Mozilla, c'est le même programme et vous disposez des mêmes ressources dans les deux fenêtres.

    Un des avantages de Mozilla est la possibilité d'utiliser des onglets : si vous faites Ctrl-T ou sélectionnez Navigator Tab dans le sous-menu New du menu File, vous ouvrez une fenêtre de navigation à l'intérieur de votre navigateur qui se superpose à la précédente. Vous pouvez passer de l'une à l'autre en cliquant sur les différents onglets.
  5. Mozilla se quitte en cliquant sur Quit dans le menu File ou en cliquant sur le bouton éclair (le deuxième à gauche dans la barre de titre).

    Vous pouvez aussi utiliser les raccourcis claviers pour quitter : Ctrl-Q (quitter).

Tout les programmes qui font des accès en écriture sur le disque, c'est-à-dire qui ne se contentent pas de lire mais ont besoin d'écrire des informations :

  • Les éditeurs bien sûr, avec lesquels on écrit du texte, que l'on veuille ou non le conserver (joe, pico, (x)emacs, (x)vi(m)...).
  • Les lecteurs de courrier : pine, mutt, elm...), qui écrivent sur le disque puisqu'ils stockent des copies de mails envoyés, permettent de détruire des courriers, de faire des rangements, etc.
  • Les lecteurs de news : forum, rn, trn, slrn, knews... ; dans les fichiers de configuration de ces programmes sont écrites les mises à jour : messages lus, groupes auxquels on est abonné, etc.
  • Les navigateurs (Mozilla, Lynx...), qui modifient leurs fichiers de configuration pour conserver vos marque-pages, garder une trace des dernières pages visitées, etc.
  • les jeux (scores et parties en cours).
  • Les outils divers (xpaint, xv, xfig...), dont on conserve les données.

En pratique, il faut donc quitter tout ce qu'on a ouvert; les exceptions sont les visioneurs DVI et PostScript (xdvi et gv se contentent de lire un fichier et de l'afficher, sans rien écrire) et les fenêtres terminal : vous n'avez pas besoin de fermer les fenêtres qui affichent pacifiquement un prompt.

Auteur : Émilia Robin, Yann Tholoniat, Joël Riou. Dernière modification : Thu Dec 12 04:42:13 2002 +0000 par Joël Riou. 

 TP linux installation des logiciels - Mesa3D - JDK1.6

Mesa3D

Télécharger les trois fichiers suivants:

  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaLib-6.4.2.tar.gz
  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaGLUt-6.4.2.tar.gz
  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaDemos-6.4.2.tar.gz

"Dégziper" ces trois fichiers.
"Détarer" les trois fichiers obtenus après "dégzipage".

Un seul répertoire nommé Mesa-6.4.2 devrait avoir été restoré.
Il contient la distribution Mesa3D (compatible OpenGL) en version 6.4.2 sous la forme d'un ensemble de fichiers source C et des fichiers de gestionnaire de projet (workspace Visual C++, makefile pour gcc, ...) permettant de compiler ces sources sous la forme de binaires:

  • MesaLib : La librairie Mesa3D
  • MesaGLUt : Une bibliothèque de construction d'interface graphique pour programme OpenGL
  • MesaDemos : Des exemples d'utilisation d'OpenGL et GLUt.
  • Réaliser la compilation de Mesa-6.4.2.
  • Tester l'installation de Mesa-6.4.2 réalisable après compilation.
  • Vérifier la bonne exécution de programmes exemples compilés.
  • On donne le fichier source Anim.cpp.
    Télécharger, compiler et exécuter ce source en langage C.

JDK 1.6

Télécharger le fichier suivant:

  • http://raphaello.univ-fcomte.fr/ftp/Java/Jdk/jdk-6-linux-i586.bin

Il s'agit du fichier d'installation du kit de développement Java version 6.

  • Réaliser l'installation de ce jdk.
  • Tester la version de compilateur installée.
  • Tester la version de "runtime" installée.
  • Compiler et exécuter le programme java Fibonacci.java

Correction

{sidebar id=6}{sidebar id=1}

Mesa3D

Télécharger les trois fichiers suivants:

  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaLib-6.4.2.tar.gz
  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaGLUt-6.4.2.tar.gz
  • http://raphaello.univ-fcomte.fr/ftp/MesaOpenGL/MesaDemos-6.4.2.tar.gz

"Dégziper" ces trois fichiers.

gunzip MesaLib-6.4.2.tar.gz
gunzip MesaGLUt-6.4.2.tar.gz
gunzip MesaDemos-6.4.2.tar.gz

"Détarer" les trois fichiers obtenus après "dégzipage".

tar -xvf MesaLib-6.4.2.tar
tar -xvf MesaGLUt-6.4.2.tar
tar -xvf MesaDemos-6.4.2.tar

Un seul répertoire nommé Mesa-6.4.2 devrait avoir été restoré.
Il contient la distribution Mesa3D (compatible OpenGL) en version 6.4.2 sous la forme d'un ensemble de fichiers source C et des fichiers de gestionnaire de projet (workspace Visual C++, makefile pour gcc, ...) permettant de compiler ces sources sous la forme de binaires:

  • MesaLib : La librairie Mesa3D
  • MesaGLUt : Une bibliothèque de construction d'interface graphique pour programme OpenGL
  • MesaDemos : Des exemples d'utilisation d'OpenGL et GLUt.
  • Réaliser la compilation de Mesa-6.4.2.

Depuis le répertoire Mesa-6.4.2
make linux-x86
make install

La deuxième commande ne fonctionnera peut-être pas correctement car elle peut nécessiter de posséder les privilèges "root".

  • Tester l'installation de Mesa-6.4.2 réalisable après compilation

cf make install ci-dessus.

  • Vérifier la bonne exécution des programmes exemples compilés.

Ils se trouvent dans les sous-répertoires de Mesa-6.4.2/Progs.

  • On donne le fichier source Anim.cpp.
    Télécharger, compiler et exécuter ce source en langage C.

gcc -I/home/nico/Mesa-6.4.2/include -c Anim.cpp -o Anim.o

gcc -L/home/nico/Mesa-6.4.2/lib -lm -lGL -lglut Anim.o -o Anim

Anim

JDK 1.6

Télécharger le fichier suivant:

  • http://raphaello.univ-fcomte.fr/ftp/Java/Jdk/jdk-6-linux-i586.bin

Il s'agit du fichier d'installation du kit de développement Java version 6.

  • Réaliser l'installation de ce jdk.

Le fichier télécharger est un script shell d'installation.
Le rendre exécutable s'il ne l'est pas a l'arrivée. Le lancer par son nom.

  • Tester la version de compilateur installée.

Dans le sous-répertoire bin du répertoire d'installation.
javac -version

  • Tester la version de "runtime" installée.

Dans le sous-répertoire bin du répertoire d'installation.
java -version

  • Compiler et exécuter le programme java Fibonacci.java.

javac Fibonacci.java
java Fibonacci

TP unix - droit accès aux fichiers - commande chmod - unmask

Exercice 1: Droits d'accès

Sachant que {sidebar id=6}

#ls –l /home/user1

drwx------ user1 user1 /home/user1

# cat /etc/group |grep “^user1:”

user1:x:501:

  1. Quels sont les droits sur le répertoire /home/user1 ?
  2. L’utilisateur user2 peut-il pénétrer ou seulement lister les fichiers de /home/user1 ? et user3, le pourrait-il s'il faisait partie du groupe de user1 ?
  3. Quelles commandes devrait écrire user1 pour accorder le droit de visite de son répertoire personnel seulement à user3 ?

Exercice 2: commande unmask

Sashant que

#umask 0022

  1. Quels sont les droits par défaut d’un fichier
  2. Quels sont les droits par défaut d’un répertoire

Exercice 3: Droits d'accès

#ls –ld /home/rep_partage  {sidebar id=1}

drwxrwxrwx  root root        /home/rep_partage

# ls –l /home/rep_partage

-rw-rw---- user1 user1 f1

-rw-r----- user2 user2 f2

  1. Est ce que l’utilisateur user2 peut supprimer le fichier f1 ? justifier votre réponse.
  2. Si oui comment faire pour empêcher un utilisateur de supprimer les fichiers de /home/rep_partage qui ne lui appartient pas.

Exercices unix pragrammation des scripts shells -6-

Exercice 1

Créer un script shell nommé "change" qui affichera la date de dernière modification d'un fichier puis la modifiera avec l'heure actuelle et enfin réaffichera la date de dernière modification du fichier.
Cette procédure acceptera 1 paramètre qui sera le nom du fichier.

Lorsque vous exécuterez "change mon_fic", le 8 octobre à 15 heures 12 vous obtiendrez le résultat:

avant : -r--r--r-- 1 user group 40 Fev 3 2001  mon_fic
après : -r--r--r-- 1 user group 40 Oct 8 15:12 mon_fic

Exercice 2

Créer un script shell nommé "nombreJours" qui affichera le nombre de jours du mois courant.

"nombreJours" affichera pour février 2007 le message "28 jours en février 2007".

Exercice 3

Créer un script shell réalisant la création d'un répertoire "Exo3" contenant 10 fichiers nommés "Un" à "Dix". Chaque fichier contient une seule ligne:

  • "Un" contient "Première ligne"
  • "Deux" contient "Deuxième ligne"
  • ...
  • "Dix" contient "Dixième ligne"
  1. Vérifier que le répertoire à créer n'existe pas déjà auquel cas il ne sera pas recréé mais les fichiers si.

Exercice 4

Créer un script shell qui réalise les opérations suivantes:

  • Création sous votre répertoire "TP2" d'un sous répertoire nommé "annéemoisjour" (20070202 pour le 2 février 2007).
  • Copie des fichiers de "Exo3" sous ce répertoire puis effacement de ces mêmes fichiers de "Exo3".
  • Création de deux fichiers sous le répertoire d'accueil (HOME) de la personne qui a lancé le shell:
    • un fichier nommé "Gros_fichier.numero_du_shell" dans lequel se trouvera le contenu concaténé des fichiers traités
    • un fichier nommé "Nom_du_script.numero_du_shell" dans lequel se trouvera le nom des fichiers traités.
  1. Vérifier que le répertoire à créer n'existe pas déjà.

Exercice 5

  • Créer un script permettant d'afficher la liste des fichiers du répertoire /etc accessibles en lecture.
  • Créer un script permettant d'afficher la liste des fichiers du répertoire /etc accessibles en écriture.

Exercice 6

Créer un script nommé "table" permettant d'afficher des tables de multiplication.
"table 5 10" aura pour résultat l'affichage:

0 x 5 = 0
1 x 5 = 5
2 x 5 = 10
3 x 5 = 15
4 x 5 = 20
5 x 5 = 25
6 x 5 = 30
7 x 5 = 35
8 x 5 = 40
9 x 5 = 45
10 x 5 = 50

Corrections des exercices

{sidebar id=6}{sidebar id=1}

Exercice 1

change.bash

12345AVANT=$(ls -l $1)touch $1APRES=$(ls -l $1)echo "Avant : "$AVANTecho "Apres : "$APRES

Exercice 2

nombreJours.bash

1234567891011121314151617181920212223242526272829303132333435363738394041424344MOIS=$(date +"%m")case $MOIS in01) NOM="janvier";;02) NOM="fevrier";;03) NOM="mars";;04) NOM="avril";;05) NOM="mai";;06) NOM="juin";;07) NOM="juillet";;08) NOM="aout";;09) NOM="septembre";;10) NOM="octobre";;11) NOM="novembre";;12) NOM="decembre";;esacANNEE=$(date +"%Y")case $MOIS in01|03|05|07|08|10|12)echo "31 jours en "$NOM" "$ANNEE;;04|06|09|11)echo "30 jours en "$NOM" "$ANNEE;;02)BISSEXTILITE=$(expr $ANNEE % 4)if [ $BISSEXTILITE != 0 ]thenecho "28 jours en "$NOM" "$ANNEEelseBISSEXTILITE=$(expr $ANNEE % 100)if [ $BISSEXTILITE != 0 ]thenecho "29 jours en "$NOM" "*ANNEEelseBISSEXTILITE=$(expr $ANNEE % 400)if [ $BISSEXTILITE != 0 ]thenecho "28 jours en "$NOM" "$ANNEEelseecho "29 jours en "$NOM" "$ANNEEfififi;;esac

Exercice 3

script3.bash

12345678910111213141516test -e Exo3if [ $? != 0 ]thenmkdir Exo3fiecho "Premiere ligne" >Exo3/Unecho "Deuxieme ligne" >Exo3/Deuxecho "Troisieme ligne" >Exo3/Troisecho "Quatrieme ligne" >Exo3/Quatreecho "Cinquieme ligne" >Exo3/Cinqecho "Sixieme ligne" >Exo3/Sixecho "Septieme ligne" >Exo3/Septecho "Huitieme ligne" >Exo3/Huitecho "Neuvieme ligne" >Exo3/Neufecho "Dixieme ligne" >Exo3/Dix

Exercice 4

script4.bash

1234567891011121314REP=$(date +"%Y%m%d")test -e $REPif [ $? != 0 ]thenmkdir $REPficp Exo3/* $REPrm Exo3/*for file in $REP/*docat $file >> ~/Gros_fichier.$$echo $file >> ~/$0.$$done

Exercice 5

script5a.bash

12345678for FILE in /etc/*doif test -r $FILEthenecho $FILEfidone

Exercice 6

table.bash

1234for V in $(seq 0 $2)doecho $V" x "$1" = "$(expr $V "*" $1 )done

Exercices unix programmation script shell - awk

Les exercices portent sur le fichier mesure suivant:

nom de la mesure|lieu de la mesure|date de la mesure|valeur brute|correction 1|correction 2|correction 3|valeur corrigée

|

marcel|brest|18/12/1998|12.5|1.34|1.23|-1.5|13.47

|

polo|loctudy|21/05/1997|11.5|1.24|1.12|-1.2|12.66

|

otto|camaret|04/09/1995|9.3|0.98|1.17|-1.12|10.33

|

Le champ valeur corrigée est la somme algébrique de la valeur brute et des 3 corrections.

Exercice 1 {sidebar id=1}

Vous vous êtes bourrés sur le signe de la correction 1, de même dans la correction 2, vous avez découvert que vous avez commis une petite erreur et qu'il fallait lui ajouter 0.1. Modifier le fichier en prenant en compte ces corrections, faites en sorte que la valeur corrigée soit modifiée en conséquence.

Dans le même exercice vous afficherez la somme totale des valeurs corrigées et la valeur corrigée moyenne. Ces valeurs doivent être sauvegardées dans un fichier résultat.

Solution:

123456789NR = =1 { printf("%s\n",$0)}NR>1 { $5*=-1$6+=0.1$8=$4+$5+$6+$7somme+=$8printf("%s\n",$0)}END { printf("somme totale des valeurs corrigées %f \n",somme) > "resultat";printf("valeur corrigée moyenne %f \n" (somme/(NR-1)) >> "resultat"}' $1

Appelez votre script exo1.awk, donnez lui les droits 755, et appelez le ainsi:

exo1.awk mesure > mesure.corrigee

Après exécution, vérifiez l'existence et le contenu du fichier resultat.

Exercice 2

Afficher les mesures ayant une année paire. Redirigez le résultat de la recherche vers un fichier paire.

Solution:

123456#!/bin/bashawk ' BEGIN { printf("Mesures ayant une année paire \n") > "paire";FS="|"}NR>1 { annee=substr($3,7,4)if (annee%2= =0){ printf("mesure %s ",$1); printf(" année %s paire\n ",annee) >> "paire"}' $1

Appelez votre script exo2.awk, donnez lui les droits 755, et appelez le ainsi: {sidebar id=6}

exo2.awk mesure

Après exécution, vérifiez l'existence et le contenu du fichier paire.

Exercice 3

Vérifiez que le format de la date jj/mm/aaaa est correcte ainsi que le format du lieu (formé que de lettres de l'alphabet en minuscules ou majuscules).

Solution:

12345NR>1 && $2 !~ /^[0-3][0-9]\/[01][0-9]/\[0-9][0-9][0-9][0-9]$/{ printf(" Mauvais format de date pour mesure %s \n", $1 }NR>1 && $2 !~ /^[a-zA-Z][a-zA-Z]*$/{ printf(" Mauvais format du lieu pour mesure %s \n",$1 }' $1

Appelez votre script exo3.awk, donnez lui les droits 755, et appelez le ainsi:

exo3.awk mesure

Le fonctionnement du script sous LINUX est un peu foireux, ça marche bien par contre sur d'autres environnements (HP-UX ou Solaris), va savoir pour quoi...

On pourrait améliorer encore plus la vérification en vérifiant bien que la date va de 1 à 31 et le mois de 1 à 12, avec un script du style:

123456789101112131415 #!/bin/cshNR>1 && $3 !~ /^[0-3][0-9]\/[01][0-9]/\[0-9][0-9][0-9][0-9]$/{ jour=substr($3,1,2)mois=substr($3,3,2)if (jour > 31 || mois >12) { printf("mauvais format pour mesure %s\n",$1)}}' $1

C'est un peu lourd comme script, à vous de trouver plus simple. Toujours un fonctionnement capricieux sous LINUX.

Exercice 4

Afficher les noms de mesure et leur valeur corrigée associée en vous servant d'un tableau associatif.

Solution:

123456 #!/bin/bashNR>1 { mesure-corrigee[$1]=$8END{ for (mesure in mesure-corrigee){printf("mesure %s ",mesure); printf(" égale à %s \n",mesure-corrigee[mesure]) }}' $1

Appelez votre script exo4.awk, donnez lui les droits 755, et appelez le ainsi:

exo4.awk mesure

TP exercice unix Reseaux Configuration et Test

Exercice 1

Utilisez la commande « ifconfig » pour découvrir l'adresse de votre machine.

Exercice 2

Travaillez dans cet exercice en tant que simple utilisateur.

La commande « ping » permet de tester la couche logicielle IP d'une machine distante (Unix ou pas).

Tester cette commande et ses diverses options possibles :

  • « ping machine »
  • « ping machine » en mode verbeux
  • « ping machine » avec arrêt automatique au bout de N fois
{sidebar id=6}{sidebar id=1}

Exercice 4

Ethernet est le protocole physique utilisé par le réseau sous Unix.
IP est le protocole logiciel utilisé par le réseau sous Unix.

Nécessairement, à un moment, il y a une association entre une adresse logicielle IP et une adresse physique Ethernet.
C'est le protocole ARP (Address Resolution Protocol) qui s'en charge.

Que renvoit « ifconfig -a » ?
Trouvez-y l'adresse matérielle de votre machine.

Que fait la commande « arp -a -v » ?

Sous LINUX, que renvoit « cat /proc/net/arp » ?

Exercice 5

Redémarrez le PC LINUX.
Que contient la table ARP ?

Retirez quelques entrées de la table renvoyée. Pour savoir comment faire, n'hésitez pas à consulter la page de manuel de la commande « arp ».

Après avoir visualisé le contenu de la table ARP par « arp -a », contactez une machine de la salle de TP au moyen par exemple de la commande « ping » (ou « telnet », « rlogin »). Que constatez-vous alors au niveau de la table ARP ?

Faites maintenant « ping ftp.lip6.fr ».
Que constatez-vous au niveau de la table ARP ? Pourquoi à votre avis ne voit-on pas l'adresse Ethernet de la machine «
ftp.lip6.fr » ?

Après avoir visualisé le contenu de la table ARP par « arp -a », faites un « ping » sur l'adresse de broadcast. Quelle option est-elle nécessaire pour cela ? Regardez l'état de la table ARP juste après.

Exercice 8

Ajoutez dans le fichier « /etc/hosts » de votre machine un alias pour la machine voisine.
Testez-le pour vérifier qu'il est bien pris en compte

Retirez de « /etc/hosts » l'entrée que vous y aviez ajoutée. Est-ce que votre test précédent continue de marcher ?

Exercice sur la commande less

1.  Comment fait-on pour obtenir une page d'aide avec less ?
2.  Comment examiner plusieurs fichiers à la suite ? Comment passe-t-on au suivant ? Comment revient-on au précédent ?
3.  Quelles sont les commandes différentes qui permettent de quitter less ?
4.  Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la ligne n ?
5.  Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la première ligne où apparaît un motif
donné ?
6.  Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement après et avant la position courante ?
7.  Comment dire à less de chercher le mot à partir de la première ligne du fichier, et ce où que l'on soit dans le fichier ?
8.  Que se passe-t-il si l'on cherche le motif suivant : «toTo» en donnant l'option -i à less ? Quelle option faut-il mettre à la place de -i pour chercher toTo tout en ignorant la casse des caractères ?
9.  Quelles sont les commandes qui permettent d'aller à la prochaine (resp. précédente) occurence du motif recherché à travers tous les fichiers édités ?
10.  Comment chercher dans un fichier le caractère / ?

 On aborde ici less, qui est une version plus élaborée de more; ce dernier est toujours détaillé dans dans les ouvrages sur Unix, et de fait il est toujours présent sur ces systèmes, ce qui n'est pas forcément vrai pour less (qui est quand même très courant). more est beaucoup plus rudimentaire, alors que less a beaucoup de fonctionnalités appréciables : vidéo inverse pour les motifs recherchés, déplacements en avant et en arrière pour la recherche, etc.

  1. Comment fait-on pour obtenir une page d'aide avec less ?

    On tape h ou H pour afficher une page d'aide. On s'y déplace comme dans less (flèches, ^D, ^F, ^B, ^P, SPC, j, k...). Pour quitter l'aide, ce sont les mêmes commandes que pour quitter less : q, Q, :q, :Q, ZZ.

  2. Comment examiner plusieurs fichiers à la suite ? Comment passe-t-on au suivant ? Comment revient-on au précédent ?

    Il suffit de donner plusieurs fichiers en argument à la commande less; par exemple, pour examiner sucessivement les fichiers toto, bla et blu, on tape :

    less toto bla blu

    Pour passer au fichier suivant, on tape :n (next); pour revenir au fichier précédent, on tape :p (previous). :x permet de revenir au premier fichier spécifié.

  3. Quelles sont les commandes différentes qui permettent de quitter less ?

    Ce sont : q, Q, :q, :Q, ZZ.

  4. Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la ligne n ?

    On spécifie le numéro de la ligne après le signe +; par exemple, pour ouvrir le fichier rapport sur la ligne 57, on tape :

    less +57 rapport
  5. Comment dire à less d'ouvrir le fichier en plaçant en haut de l'écran la première ligne où apparaît un motif donné ?

    On utilise l'option -p de la commande less; par exemple, pour chercher le mot «toto» dans le fichier rapport, on tape :

    less -p toto rapport

    On peut aussi indiquer le motif recherché de la façon suivante :

    less +/toto rapport
  6. Quelles sont les deux commandes de less qui permettent de chercher un motif dans un fichier, respectivement après et avant la position courante ?

    Pour chercher un motif plus en avant dans le texte, on utilise le slash (barre oblique vers la droite : /). Par exemple :

    /mot

    Pour chercher en arrière de la position courante, on utilise le point d'interrogation. Pour aller à la prochaine occurence du mot, il suffit de taper n (next). Pour aller à la précédente occurence du mot, il faut taper N. Évidemment, quand on cherche un motif avec ?, n remonte dans le texte et N descend dans le texte.

    Une fois le début ou la fin du fichier atteint, la recherche s'arrête. On peut utiliser les expressions régulières.

  7. Comment dire à less de chercher le mot à partir de la première ligne du fichier, et ce où que l'on soit dans le fichier ?

    Il faut taper ^F après avoir tapé /. En fait, ^F fait commencer la recherche au premier fichier dont on a donné le nom; quand il n'y en a qu'un seul, cela place de fait tout au début du fichier. Par exemple, pour chercher toto alors qu'on se trouve à la fin du fichier, on tape :

    /^F

    Le prompt devient alors :

    First-file /

    et il n'y a plus qu'à taper le motif recherché.

  8. Que se passe-t-il si l'on cherche le motif suivant : «toTo» en donnant l'option -i à less ? Quelle option faut-il mettre à la place de -i pour chercher toTo tout en ignorant la casse des caractères ?

    L'option -i signifie ignorecase, c'est-à-dire ignorer la casse des caractères (différence entre majuscules et minuscules). Si donc je tape (au choix) :

    less -ip TOTO rapportless -ip toto rapportless -i +/toto rapportless -i +/TOTO rapport

    less ne fera pas la différence entre les majuscules et les minuscules, et je trouverai toto comme TOTO. Bien sûr, c'est la même chose si je lance less avec l'option -i et que je cherche ensuite le mot à l'intérieur du fichier avec / ou ?.

    Mais l'option -i est invalidée si le motif recherché contient des majuscules et des minuscules : si, en lançant less comme ci-dessus, je cherche le motif Toto, je ne trouverai que Toto et pas TOTO par exemple. Pour contourner cette restriction, il faut lancer less avec l'option -I, qui est donc un ignorecase «robuste».

  9. Quelles sont les commandes qui permettent d'aller à la prochaine (resp. précédente) occurence du motif recherché à travers tous les fichiers édités ?

    Pour aller à l'occurence suivante (resp. précédente) d'un motif dans un fichier, on utilise n (resp. N). Pour faire la même opération mais sans passer manuellement de fichier en fichier, on tape ESC n pour chercher en avant, et ESC N pour chercher en arrière. ESC désigne bien sûr la touche d'échappement (Escape).

  10. Comment chercher dans un fichier le caractère / ?

    Le caractère / sert à chercher un mot dans le fichier. Si on tape

    //

    less répond : Pattern not found. Il faut donc dire à less de considérer le / comme un caractère ordinaire, et pas comme un caractère spécial. Comme avec toutes les expressions régulières, c'est le backslash (barre oblique vers la gauche : \) qui sert à cela. Pour chercher un /, on tape donc :

    La page de man donne une liste de caractères qui sont spéciaux avec / et ?. Ces commandes de recherche utilisent les expressions régulières de ed (et de vi par conséquent).

Auteur : Émilia Robin, Joël Riou. Dernière modification : Mon Dec 9 03:39:15 2002 +0000 par Joël Riou.     

TP unix - Sheduling -

Ouvrir une session en tant que root dans la console 1 et une session en tant que user1 dans la console 2.

{sidebar id=6}{sidebar id=1}
  1. Dans la console 1 vérifier que les démons nécessaires pour le sheduling sont démarrés.
  2. Visualiser le contenu de votre crontab. Où sont enregistrés les fichiers crontab des utilisateurs.
  3. Lister le contenu des répertoires /var/spool/cron et /var/spool/at.
  4. Modifier votre fichier crontab pour que votre système exécute la commande df chaque 5 minutes.
  5. Consulter à nouveau le répertoire /var/spool/cron qu’est ce que vous remarquez.
  6. Lancer un job qui va être exécuter d’ici 10 minutes.
  7. Lister le contenu de /var/spool/at. Qu’est ce que vous remarquez ?
  8. at 9am

at ps aux

at ^D

Quand est ce que la commande sera exécuter

9. Dans la console 2, créer un fichier crontab tel que la commande ls $HOME|wc –l sera exécuté chaque heur. Vérifier que le fichier crontab est crée. Si oui supprimer-le

10. Dans la console 1 configurer le démon crond tel que user1 ne peut plus utiliser crontab

11. Créer un fichier crontab tel que :

-         la commande cmd1 est exécutée tous les jours.

-         la commande cmd2 est exécutée chaque 15 minutes.

-         la commande cmd3 est exécutée à 18h du lundi au vendredi et à 20h le week-end.

-         la commande cmd4 à 7h10 le premier de chaque mois.

-         la date système est affichée à chaque heure sur la console.

12. Créer un fichier crontab root tel que le système enregistre de 9h à 17h, les jours ouvrables :

  1.  
    • toutes les heures, dans /var/log/processus.txt, tous les processus qui tournent sur la machine
    • tous les 5 minutes, dans /var/log/qui.txt, tous les utilisateurs connectés
    • Archivage compressé quotidien des répertoires personnels présents dans /home dans un répertoire var/sauve

N'oubliez pas d'arrêter ces taches après les avoir testées.

Exercice Unix sur la commande find

1.  Comment chercher tous les fichiers commençant par un «a» majuscule ou une minuscule, suivi d'éventuellement quelques lettres ou chiffres, par un chiffre entre 3 et 6 ?
2.  Comment fait-on pour indiquer que le fichier recherché a été modifié il y a plus de 30 jours ? Il y a 30 jours ? Il y a moins de 30 jours?
3.  Comment faire pour dire que le fichier a été modifié plus récemment qu'un autre fichier donné ?
4.  Comment fait-on pour spécifier que le fichier recherché est un répertoire ?
5.  Comment indiquer que le fichier recherché à une taille supérieure à une taille donnée ?
6.  Utiliser find pour effacer tous vos fichiers de sauvegarde (terminés par un tilde) qui ont plus d'un mois.
  1. C'est l'option -name qui permet de spécifier le nom du ou des fichiers recherchés. On peut indiquer le nom d'un fichier complet (bofichier.tex), ou utiliser des expressions régulières (celles du shell, pas celles de grep...) :

    • L'étoile (*) désigne «un ou plusieurs caractères»;
    • Le point d'interrogation remplace un (et un seul) caractère quelconque;
    • Les crochets permettent de désigner une série de caractères au choix.

    Dans notre cas, le premier caractère est un «a» ou un «A» ([aA]), suivi de quelque chose (*) et terminé par un chiffre entre 3 et 6 ([3456] ou [3-6]). On écrit donc :

    find . -name '[aA]*[3-6]' -print
  2. C'est l'option -mtime qui permet de donner une indication en jours. La syntaxe varie selon ce que l'on souhaite :

    • -mtime 30 : le fichier a été modifié il y a 30 jours;
    • -mtime +30 : le fichier a été modifié il y a 30 jours ou plus;
    • -mtime -30 : le fichier a été modifié il y a 30 jours ou moins.
  3. On utilise l'option -newer («plus récent»). Par exemple, on cherche un fichier .tex modifié plus récemment que bofichier.tex :

    find . -newer bofichier.tex -name '*.tex'

    On peut raffiner la demande, en combinant cette option avec l'option -mtime : cherchons les fichiers modifiés plus récemment que bofichier.tex, mais il y a plus de 5 jours :

    find . -newer bofichier.tex -mtime +5 -name '*.tex'
  4. On utilise l'option -type pour spécifier le genre de fichier recherché : les principaux sont f (file) pour un fichier normal, et d (directory) pour un répertoire. On tape donc :

    find . -type d
  5. On utilise l'option -size, suivie d'un nombre et d'une lettre indiquant l'unité de mesure (c : octets, k : kilo-octets). Comme pour -mtime, on utilise +, - ou [rien] pour indiquer que la taille est, respectivement, supérieure, inférieure ou égale à la valeur donnée.

    Par exemple, on recherche un fichier modifié il y a moins de 12 jours et dont la taille soit supérieure à 30 K :

    find . -type f -size +30k -mtime -12 -print

La ligne utilisée pour trouver ces fichiers et la suivante :

find . -mtime +30 -name '*~'

Il y a deux façons de faire exécuter des commandes sur les fichiers trouvés par find : utiliser l'option «-exec commande», ou utiliser un pipe avec xargs.

  1. -execcommande exécute la commande sur le fichier courant. La commande est terminée par le marqueur ;, qu'il faut protéger du shell avec un backslash. Le fichier courant est désigné par la chaîne {}.

    Pour effacer tous les fichiers de sauvegarde vieux de plus d'un mois, on tape donc :

    find . -mtime +30 -name '*~' -print -exec rm \;

    On peut faire exécuter la commande de façon interactive en remplaçant -exec par -ok :

    find . -mtime +30 -name '*~' -print -ok rm \;

    Le programme demande, pour chaque fichier trouvé, si on veut bien exécuter la commande; la réponse doit être «y» ou «Y».

  2. La solution avec -exec est en fait très lourde, car elle crée un nouveau processus pour chaque fichier; il vaut mieux rediriger le résultat de find avec un pipe et xargs. Dans notre cas, on tapera donc :find . mtime +30 -name '*~' | xargs -p rm

    L'option -p de xargs rend cette commande interactive. Il faut répondre «y» ou «Y» pour confirmer.

Quelle différence y a-t-il entre un simple pipe et «| xargs» ? Pour la comprendre, voici un exercice : cherchez tous les fichiers contenus dans /usr/local/lib/texmf/tex et cherchez dedans le mot «supertab». Il y a deux solutions :

  1. Vous tapezfind /usr/local/lib/texmf/tex -type f | grep supertab

    Vous obtenez une liste de fichiers contenant «supertab» dans leur nom.

  2. Vous tapezfind /usr/local/lib/texmf/tex -type f | xargs grep supertab

    grep cherche dans chaque fichier passé en argument la chaîne de caractères «supertab», ce qui est très différent...

Auteur : Émilia Robin, Joël Riou. Dernière modification : Mon Dec 9 03:39:15 2002 +0000 par Joël Riou.     

TP unix Gestion de repertoires fichiers utilisateurs

Répertoires et fichiers

Exercice 1:  

1 - Quelles sont, à votre avis, les commandes suivantes qui fonctionnent :

ls -R | more {sidebar id=1} echo toto | rm echo toto | mkdir ls -R | tail -3 cat toto | head -2 ls -Rl | grep rwxr-- | more grep cheval toto | sort -r

2 - Que fait la commande suivante :

       ls -laR $HOME | grep -v total | grep -v $USER

3 - Que fait la commande ci-après :

       ls -l /usr | grep '^d' | tee liste | wc -l

Gestion des groupes et des utilisateurs

Exercice  2: 

  1. Lancez la commande « ypcat passwd > passwords ».
    Que fait-elle ?

2.       On utilisera le fichier « passwords » tout au long du TP. Le format du fichier généré est :

login : mot de passe : UID numérique : GID numérique : gecos : homedir : shell

Le séparateur des champs est le caractère «:». Les champs sont ainsi accolés sans caractères espace.
Le fichier «
passwords » que l'on a généré n'est pas trié.

3.       Triez le fichier par ordre croissant de login.

  1. Triez le fichier « passwords » par ordre croissant de UID.
  2. Combien de lignes le fichier passwords contient-il ?

Exercice 3:

  1. Affichez les 5 premières lignes des comptes ordonnées par UID.
  2. Affichez la quatorzième ligne des comptes ordonnées alphabétiquement.
  3. Au moyen de la commande « cut » (entre autres), affichez les noms de login des gens de ARS en triant le résultat par ordre alphabétique.
  4. Au moyen de la commande « cut » (entre autres), affichez les noms de login des gens de ARS en triant le résultat par UID.
  5. Au moyen de la commande « cut » (entre autres), affichez le nom de login et l'état civil des gens de ARS. Le résultat sera trié par ordre alphabétique décroissant des logins.
  6. Au moyen de la commande « cut » (entre autres), essayez d'inverser les champs 1 et 5 dans l'affichage précédent. Y arrivez-vous ?
  7. on séparera l'état civil du login, cette fois-ci, par le caractère point-virgule (comme si on voulait exporter le résultat vers Excel).
  8. Triez le résultat précédent sur le nom de login.
    Pour cela, on pipera le résultat précédent dans une commande de tri.

Exercice 7 

{sidebar id=6}

La commande « uniq » supprime dans un fichier plusieurs lignes consécutives strictement identiques.

Créez un fichier « foo » et copiez-y les lignes :

La poste est en greve.La poste est en greve.La poste est en greve.Les eboueurs sont en greve.Les eboueurs sont en greve.La poste est en greve.La poste est en greve.

Appliquez la commande uniq à ce fichier et constatez le résultat.

Triez le fichier puis appliquez la commande uniq et constatez le résultat.

Exercice 8

Les utilisateurs appartiennent à un groupe. Celui-ci est identifié par un nombre (le gid pour group identifier) dans le fichier /etc/passwd.

A l'aide de la commande grep, obtenez la liste des lignes dans /etc/passwd qui correspondent aux utilisateurs d'un groupe donné par son numéro. On prendra soin à ne pas afficher les lignes contenant ce numéro en position autre que gid.

Comment faire pour obtenir cette liste dans un fichier placé dans votre répertoire courant ?

TP unix ( gestion des repertoires )

1.      

Affichez le nom du répertoire courant avec la commande pwd (print working directory).

Changez votre répertoire courant pour remonter dans le répertoire parent avec la commande cd (change directory) suivie du nom du répertoire.

Changez votre répertoire courant pour revenir à votre répertoire initial à l'aide de la commande cd sans argument. Vérifiez que vous êtes bien revenu à votre point de départ.

2.      

Placez vous dans votre répertoire d'accueil.

Soit la succession suivante de commandes :  {sidebar id=1}

cp /etc/hosts amkdir b ccd bcp ../a dmkdir ../e fcdcp a b/f/gcd b/fcp g ../../ecd ..rm ../armdir ../cmv ../e/g ../e/x

Dessinez l'arborescence résultante.
Quel est le répertoire courant à la fin de l'opération ?

Il n'est pas nécessaire de taper les commandes pour faire cet exercice.

3.      

Quelle séquence de commandes vous permet de créer l'arborescence de la figure ci-dessous :

  1. Créez deux sous répertoires, l’un ayant comme nom votre prénom, et l’autre comme nom votre nom de famille
  1. Affichez le contenu de votre répertoire d’accueil de trois manières différentes :
  1.    {sidebar id=6}
    • Par ordre alphabétique 
    • Par date de création des fichiers 
    • Une autre option de votre choix (expliquer)
  1. En partant de votre répertoire d’accueil, changez de répertoire pour vous positionner dans le répertoire (prénom), et créez trois fichiers comme indiqué ci-dessous 
  1.  
    • touch fichier1
    • > fichier2
    • ls -la > fichier3
    • cat fichier3 > fichier4
    • cat > fichier5 (tapez à ce moment du texte ensuite vous terminez par ctrl-d).
  1. Copiez deux de ces fichiers dans le répertoire (nom de famille) à partir du répertoire courant (prénom)
  1. Effacez une des copies (se trouvant dans le répertoire nom de famille), toujours à partir du répertoire courant (prénom).
  1. Changez les noms des cinq fichiers se trouvant dans le répertoire courant.
  1. Déplacez un de ces fichiers vers le répertoire nom de famille.
  1. A partir du répertoire courant (prénom), copiez vers ce répertoire un des fichiers se trouvant dans le répertoire nom de famille. 
  1. En une seule ligne de commande, changez de répertoire pour celui du nom de famille et affichez son contenu.
  1. Exécutez la commande cd sans arguments et expliquez ce qui se passe.
  1. Positionnez-vous sur votre répertoire d’accueil (si vous n’y êtes pas déjà) et afficher à l’écran TOUS les fichiers incluant les sous répertoires et leurs fichiers.
  1. Écrire la commande qui permet d’afficher:

·         les 2 premières lignes du fichier prog1.cpp.           

·         les 3 dernières lignes du fichier prog1.cpp.            

·         la 4ème ligne du fichier prog1.cpp.                         

Article publié le 24 Septembre 2009 Mise à jour le Samedi, 17 Décembre 2022 20:27 par Salim KHALIL