****************************************** * UNIX ET PROGRAMMATION SHELL * * EXAMEN DE TRAVAUX - PRATIQUES * * 17 Decembre 2012 de 13:30 -- 15:00 * ****************************************** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Vous repondrez aux questions posees directement dans ce fichier en precisant sommairement les commandes et leurs options qui vous ont permis d'aboutir a vos reponses. Vous pouvez utiliser les informations presentes sur votre compte, la documentation en ligne de commande, aucun autre document n'est autorise. Le sujet contient beaucoup de question, il n'est pas necessaire de tout faire pour avoir une note maximale. /\ / \ Pour validez votre travail a la fin de l'examen : / !! \ ------ /home/partage/validexam I54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ===================== 0. Historique ===================== Preciser la configuration de votre historique des commandes : les variables principales, leurs valeurs ... L'historique est gere par la commande interne history. Les principales sont variables : - HISTFILE : ou sont stockees les commandes. - HISTSIZE : nombre de commandes a rappeler. - HISTFILESIZE : nombre de commandes a memoriser. [pl@epsilon ~]$ echo $HISTFILE /home/pl/.bash_history [pl@epsilon ~]$echo $HISTFILESIZE 1000 [pl@epsilon ~]$echo $HISTSIZE 1000 [pl@epsilon ~]$ wc -l $HISTFILE 1000 /home/pl/.bash_history ===================== 1. Machine ===================== Il s'agit de donner quelques caracteristiques de la machine sur laquelle vous etes logue : [a] information sur le processeur [pl@epsilon ~]$ lscpu Architecture : i686 Mode(s) opératoire(s) des processeurs : 32-bit Boutisme : Little Endian Processeur(s) : 1 Liste de processeur(s) en ligne : 0 Thread(s) par cœur : 1 Cœur(s) par socket : 1 Socket(s) : 1 Identifiant constructeur : GenuineIntel Famille de processeur : 6 Modèle : 13 Révision : 6 Vitesse du processeur en MHz : 600.000 BogoMIPS : 1196.10 [pl@epsilon ~]$ grep processor /proc/cpuinfo processor : 0 model name : Intel(R) Pentium(R) M processor 1.60GHz Un seul processeur. [b] memoire vive [pl@epsilon ~]$ free total used free shared buffers cached Mem: 507792 496864 10928 0 33364 232952 -/+ buffers/cache: 230548 277244 Swap: 1048572 192120 856452 Il y a 512 Mo de memoire vive : very old machine ! [pl@epsilon ~]$ head -5 /proc/meminfo MemTotal: 507792 kB MemFree: 24932 kB Buffers: 39572 kB Cached: 189484 kB SwapCached: 22528 kB [c] capacite du disque contenant /tmp [pl@epsilon ~]$ df /tmp Sys. fich. 1K-blocks Util. Disponible Uti% Monté sur /dev/mapper/vg_dellpl-lv_root 17893260 6662592 10332828 40% / [pl@epsilon ~]$ df -h | grep mapper Sys. fich. Taille Util. Dispo Uti% Monté sur /dev/mapper/vg_dellpl-lv_root 18G 6,4G 9,9G 40% / /tmp est monte sur la partition / de capacite 18 Go, c'est pratiquement la capacite du disque. [d] distribution Il n'y a pas toujours de commande standard pour identifier la distribution... Le noyau et le systeme d'exploitation : [pl@epsilon ~]$ uname -so Linux GNU/Linux [pl@epsilon ~]$ man -k release gnu_get_libc_release (3) - get glibc version and release gnu_get_libc_version (3) - get glibc version and release lsb_release (1) - manual page for FSG lsb_release v2.0 os-release (5) - Operating system identification qrls (1p) - release batch jobs sigpause (3) - atomically release blocked signals and wait for interrupt Tcl_Release (3) - avoid freeing storage while it is being used [pl@epsilon ~]$ cat /etc/os-release NAME=Fedora VERSION="17 (Beefy Miracle)" ID=fedora VERSION_ID=17 PRETTY_NAME="Fedora 17 (Beefy Miracle)" ANSI_COLOR="0;34" CPE_NAME="cpe:/o:fedoraproject:fedora:17" ===================== 2. Commande usuelles ===================== commande pour lister les noms des fichiers dans l'arborescence /tmp de suffixe .txt contenant au moins un nombre de trois chiffres. [a] solution basee sur find [pl@epsilon ~]$ echo 123 > /tmp/yes.txt [pl@epsilon ~]$ echo 12 > /tmp/no.txt [pl@epsilon ~]$ find /tmp -name "*.txt" -exec grep -lE '[0-9]{3}' {} \; 2>/dev/null /tmp/cal.txt /tmp/cookies.txt /tmp/yes.txt [b] solution basee sur grep [pl@epsilon ~]$ grep -rlE '[0-9]{3}' --include=*.txt /tmp 2> /dev/null /tmp/cal.txt /tmp/cookies.txt /tmp/yes.txt ===================== 3. Divers ===================== [a] Quel est le premier appel systeme lance par l'execution de la commande ls /tmp ? [pl@epsilon ~]$ strace ls /tmp |& head -5 execve("/bin/ls", ["ls", "/tmp"], [/* 45 vars */]) = 0 brk(0) = 0x839a000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7778000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 strace lance la commande ls (execve) le premier appel prpre a ls est donc brk(0) (gestion memoire). [b] On suppose que [ -d /tmp/tmp ] renvoie faux. Comment creer le repertoire /tmp/tmp/tmp en une commande ? mkdir -p /tmp/tmp/tmp/ [d] Que doit valoir la chaine yes pour que la ligne : if [ "$yes" = '$yes' ]; then yes no; fi envoie no no no no ... yes no ecrit no no no... Il faut donc que le contenu de yes soit la chaine 4 de caracteres $,y, e, s. [pl@epsilon ~]$ yes='$yes' [pl@epsilon ~]$ echo $yes $yes [pl@epsilon ~]$ if [ "$yes" = '$yes' ]; then yes no; fi | head -3 no no no [e] Comment obtenir le nom (lundi, mardi,...) du jour avec la commande date ? [pl@epsilon ~]$ date +%A mercredi [f] Avec la commande sed, comment remplacer tous les chiffres d'un fichier par des @ ? [pl@epsilon ~]$ date > /tmp/test.txt [pl@epsilon ~]$ cat /tmp/test.txt mer. déc. 26 11:02:32 CET 2012 [pl@epsilon ~]$ sed -i 's/[0-9]/@/g' /tmp/test.txt [pl@epsilon ~]$ cat /tmp/test.txt mer. déc. @@ @@:@@:@@ CET @@@@ ===================== 3. Programmation ===================== [a] Ecrire un script qui donne les caracteristiques user/commande/pid/ppid du processus de plus grand pid ayant un uid > 999 scr=0 ps --no-headers -eo pid,uid > /tmp/file.txt while read pid uid do if [ $uid -ge 1000 ]; then if [ $pid -gt $scr -a $pid -ne $$ ]; then scr=$pid fi fi done < /tmp/file.txt echo pid=$$ scr=$scr ps -ouser,cmd,pid,ppid -p $scr [pl@epsilon ~]$ ./script.sh pid=4261 scr=3676 USER CMD PID PPID pl /usr/lib/xulrunner-2/plugin 3676 1463 [b] Proposer une amelioration pour illustrer une fonctionnalite de bash. On illustre : $( ) pour afficher l'ascendence du du processus realisant le meilleur score. while [ $scr -ge 1 ] do ps -ouser,cmd,pid,ppid -p $scr scr=$( ps -oppid -p $scr | tail -1 ) done [c] Faire la meme chose que [a] mais sur une ligne de commande. [pl@epsilon ~]$ ps -eo pid,uid,ppid,comm,user \ | awk '{if ($2 >999) print $5,$3,$4}' \ | tail -5 | head -1 3676 1463 plugin-containe