TP2 Unix / Linux Redirection des entrées/sorties Commandes find, grep, sort, wc, head, tail, less Gestion des Processus et communications par signaux Session utilisateur : variables d'environnement et fichier.profile Ce TP sera réalisé sur Linux distribution Suse 10, version serveur d'entreprise (Suse ES10) Les modes opératoires, et les commandes utilisées sont souvent semblables sur d'autre distributions Linux et même d'autres systèmes Unix. Par contre, l'outil d'administration Yast est spécifique à la distribution Suse Yast 1 = Yet another Setup Tool Ouvrir une session Unix sous son nom personnel On travaillera en mode texte, soit directement dans la fenêtre courante si la session est en mode texte, soit dans une fenêtre de "Terminal" si la session est une session graphique. Créer un dossier ~/TP2 par mkdir ~/TP2 Les fichiers et dossiers qui seront créés dans le cadre de ce TP seront systématiquement créés dans le dossier ~/TP2 Table des matières Redirection des entrées/sorties... 2 Redirection simple des sorties " >"...2 Redirection des sorties en complémentarité: ">>"... 2 Redirection des entrées... 2 Enchaînement des commandes par "tube" ou "pipe" : " " (Alt Gr + 6)... 3 Alias de commandes...3 Modifier le fichier de configuration ~/.profile... 3 Commandes de traitement des fichiers de texte... 4 recherche de texte par grep... 4 Visualiser ou compter les lignes d'un fichier de texte... 4 Trier un fichier de texte... 5 Exemples d'enchaînement de commandes... 5 Commande find... 5 Gestion des processus...6 Liste des processus...6 Description d'un processus... 6 Communications interprocessus par signaux...7 Notes...8 1 cf Yac : Yet another Compiler TP N 2 Unix / Linux ICASE 1 / 9 Groupe esaip
Redirection des entrées/sorties Redirection simple des sorties " >" Faire de ~/TP2 de répertoire courant cd ~/TP2 Créer un fichier en utilisant la commande echo Bonjour > bonjour.txt Afficher le contenu de bonjour.txt par la commande cat Vérifier la taille de ce fichier en utilisant les commandes ls et du Quels sont les droits d'accès à ce fichier? Donner les droits d'accès 0660 à ce fichier (commande chmod) A quoi correspondent les droits d'accès 0660? r et w pour le propriétaire et le groupe que fait la commande >bonjour.txt? vide le fichier sans changer les droits d'accès quelle différence avec la commande rm bonjour.txt; touch bonjour.txt? les droits d'accès sont changés car un nouveau fichier est créé Redirection des sorties en complémentarité: ">>" Quelle différence entre les 2 lignes de commandes suivantes? echo Bonjour > bonjour.txt; echo Bonjour > bonjour.txt 1 seule ligne dans le fichier echo Bonjour > bonjour.txt; echo Bonjour >> bonjour.txt 2 lignes dans le fichier Redirection des entrées Que fait la commande cat < bonjour.txt? affiche le contenu du fichier Quelle différence avec cat bonjour.txt? aucune taper la commande cat puis les entrées suivantes Bonjour Aurevoir ^D 2 Comment interpréter ce qui s'est passé? l'entrée standard de cat est le clavier, la sortie standard est la console ^D indique la fin du fichier d'entrée, donc arrêt de la commande cat 2 CTRL + d (Sous Unix le caractère de code ascii 04 = EOT, produit par CTRL+D est le code " fin de fichier texte) voir http://www.commentcamarche.net/base/ascii.php3 TP N 2 Unix / Linux ICASE 2 / 9 Groupe esaip
Enchaînement des commandes par "tube" ou "pipe" : " " (Alt Gr + 6) On peut faire en sorte que les sorties écran d'une commande deviennent les entrées d'une autre commande en réunissant ces commandes par le caractère "pipe" " " que fait la commande wc -l /etc/passwd (voir man wc) compte les lignes du fichier quelle différences avec cat /etc/passwd wc -l? aucune Alias de commandes la commande dir produit le même résultat que la commande ls -l on peut vérifier en effet que alias dir signale que dir est un alias de ls -l Supprimer l'alias par unalias dir Que produit alors la résultat de la commande dir? un affichage différente de la liste des fichiers Quelle commande est alors exécutée? le rechercher par whereis dir /usr/bin/dir redéfinir l'alias par alias dir='ls -l' Quelle commande taper pour obtenir le même résultat que dir lorsque l'alias n'est pas défini? /usr/bin/dir Afficher tous les alias définis pour votre session en tapant alias (On pourra éventuellement rechercher l'intérêt de ces alias) cd..='cd..' corrige automatiquement une écriture correcte sous Windows mais erronée sous unix md='mkdir -p' définit une commande Unix md analogue à la commande md de Windows Définir clrscr comme alias de clear et vérifier que clrscr efface l'écran, comme clear Ouvrir une autre fenêtre de commande : est-ce que la commande clrscr est définie dans cette nouvelle session? Conclusion? les alias sont spécifiques à chaque session, et devront donc être redéfinis à chaque ouverture de session Modifier le fichier de configuration ~/.profile en utilisant un éditeur 3 de texte modifier le fichier ~/.profile pour ajouter les lignes suivantes à la fin de ce fichier : unalias dir alias clrscr='clear" Ouvrir une nouvelle fenêtre (nouvelle session) et vérifier les commandes dir et clrscr Conclusion: quand le fichier.profile est-il exécuté? à l'ouverture de la session voir man bash et rechercher.bash_profile dans ce document i 3 Utiliser l'éditeur gedit ou kwrite ou kate en mode graphique; utiliser joe ou vi en mode texte. Avec joe, taper ctrl+k et ensuite h pour afficher une fenêtre d'aide. Pour utiliser vi, on pourra se référer au document suivant : "http://doc.esaip.org/~ptregouet/cours/puse Pratique Unix des Systemes d'exploitation/utiliser vi.htm" TP N 2 Unix / Linux ICASE 3 / 9 Groupe esaip
Commandes de traitement des fichiers de texte 4 recherche de texte par grep Nous allons rechercher où est défini l'alias de dir à l'ouverture de notre session. Lorsqu'on ouvre une session 2 scripts sont exécuté : 1. le script système /etc/profile 2. le script utilisateur ~/.profile 5 En utilisant grep : Rechercher "alias" dans ~/.profile. Résultat? grep alias ~/.profile résultat : rien Rechercher "alias" dans /etc/profile. Résultat? grep alias /etc/profile résultat : rien Rechercher "alias" dans /etc/*. Résultat?grep "alias dir" /etc/* 2>/dev/null résultat : /etc/bash.bashrc Conclusion? on peut vérifier (par less) que le script /etc/profile lance l'exécution de /etc/bash.bashrc Visualiser ou compter les lignes d'un fichier de texte Que permet less /etc/passwd? voir le contenu du fichier sous less, taper h ii pour avoir l'aide (help) Comment atteindre la dernière ligne? G Comment revenir à la dernière ligne? g Comment afficher les numéros de lignes? -M ce qui est sans doute une des options définies pas la variable LESS (vérifier en tapant echo $LESS) Quelles différences entre less /etc/passwd et more /etc/passwd? il est possible de revenir en arrière avec less Comment afficher numéroter les lignes en utilisant cat et less? cat -n /etc/passwd less Comment compter les lignes en utilisant wc? cat /etc/passwd wc -l Comment afficher les 3 première lignes avec head? head -3 /etc/passwd Comment afficher les 3 dernières lignes avec tail? cat -n /etc/passwd tail -3 Comment afficher les lignes 5 à 10 avec head et tail? cat -n /etc/passwd head -10 tail -6 4 Pour une document plus précise sur ces commandes, utiliser man ou se reporter aux documents suivants : http://doc.esaip.org/~ptregouet/_promo/cpi1/icase/cours Unix 2 - esaip Tregouet.pdf http://doc.esaip.org/~ptregouet/_promo/cpi1/icase/cours Unix 2 - esaip Tregouet.rtf 5 Ce peut être aussi ~/.bash_profile ou ~/.login si.profile n'existe pas (voir man bash) TP N 2 Unix / Linux ICASE 4 / 9 Groupe esaip
Trier un fichier de texte Que fait la commande sort /etc/passwd -t: -k3nr? trie /etc/passwd dans l'ordre descendant du 3ème champ (UID) Comment trier le fichier /etc/passwd 1. sur le numéro du groupe principal de l'utilisateur (ordre croissant) 2. sur le nom de l'utilisateur (ordre décroissant) sort /etc/passwd -t: -k4n -k3nr less Exemples d'enchaînement de commandes 1. Que font les commandes suivantes? /sbin/ifconfig grep adr: grep -v 127 ls -l /etc grep ^- sort -k5 affichage de la configuration des cartes réseau recherche des lignes contenant :adr à l'exclusion de celles qui contiennent 127 (interface LO) liste des fichiers de /etc recherche des lignes content "-" au début (fichiers ordinaires) tri selon le nombre d'octets du fichier 2. Comment modifier la dernière commande pour que le tri donne quelque chose d'utile? ls -l /etc grep ^- sort -k5n car le nombre d'octets est un champ numérique 3. La commande cat /etc/services affiche la liste des services réseau connus de votre systèmes. Comment compléter cette commande pour ne garder de cette liste que les services TCP (en mode connexion) ayant un rapport avec ftp. On souhaite aussi que cette liste soit triée dans l'ordre décroissant des numéros de port. cat /etc/services grep ftp grep tcp sort -k2nr Commande find Expliquer les paramètres des commandes suivantes : 1. find /etc -maxdepth 1 -name "*conf*" un seul niveau d'arborescence le nom de fichier est comme "*conf*" 2. find /etc -type f -name "*.conf" grep Perm fichiers ordinaires nom comme "*.conf" ligne contient Perm (erreurs) 3. find /etc -type f -name "*.conf" 2>/dev/null grep Perm supprimer les messages d'erreur (sortie 2=stderr) 4. find /etc -type f -name "*.conf" -ok less {} \; 2>/dev/null pour chaque fichier trouvé, proposer de voir son contenu En utilisant la commande find rechercher dans /var tous les fichiers modifiés depuis le démarrage 6 de votre ordinateur. find /var -newer /var/log/boot.msg 2> /dev/null on pourra utiliser ls -lt pour voir ensuite le contenu d'un répertoire trié par date de modification 6 On utilisera le paramètre -newer de find, en tenant dompte du fait que le fichier /var/log/boot.msg a été créé au démarrage du système. On peut vérifier que l'âge de ce fichier correspond au temps écoulé depuis le démarrage du système: ce temps est donné par la commande uptime. TP N 2 Unix / Linux ICASE 5 / 9 Groupe esaip
Gestion des processus Liste des processus Les processus de votre ordinateur sont visibles en utilisant par exemple les commandes ps auxf, ou pstree (ou pstree -p) ou top En utilisant ces 2 commandes, répondre aux questions suivantes: Combien y a-t-il de processus actuellement présents sur votre ordinateur? voir commande top Combien sont prêts (état running )?voir commande top Combien sont bloqués (état sleeping)?voir commande top Combien de processus appartiennent au superviseur 7 (root)? ps auxf grep ^root wc -l Combien appartiennent à l'utilisateur propriétaire de votre session? ps auxf grep ^$LOGNAME wc -l Quel le processus ancêtre de tous les autres? init (utiliser pstree) Quel est le numéro de ce processus? 1 (utiliser pstree -p) Pouvez-vous retrouver toutes ces informations en mode mode graphique en utilisant le moniteur système (Ksysguard)? Description d'un processus Parmi les les informations qui décrivent un processus à quoi correspondent les champs suivants affichés par la commande top 8 : PID USER PR NI numéro du processus nom du propriétaire du processus priorité du processus "nice" = courtoisie du processus (effet inverse de la priorité) VIRT taille de la mémoire virtuelle utilisée par le processus (VIRT=SWAP+RES) RES SHR taille de la mémoire réelle (RAM) utilisée par le processus taille de la mémoire partagée (utilisable par d'autres processus) S S -- Process Status 'D' = uninterruptible sleep 'R' = running 'S' = sleeping 'T' = traced or stopped 'Z' = zombie %CPU %MEM % du temps processeur consommé par ce processus depuis le dernier affichage de top (temps de rafraîchissement = 3 secondes, par défaut?) % de la mémoire réelle (RAM) utilisée par ce processus TIME+ Temps processeur en 1 / 100 sec consommé depuis le démarrage du processus COMMAND Nom du programme exécuté par ce processus 7 Utiliser pas auxf, grep et wc -l 8 Voir le cours page 24 ou man top TP N 2 Unix / Linux ICASE 6 / 9 Groupe esaip
Communications interprocessus par signaux La commande kill sert à envoyer un signal à un processus (et éventuellement à le tuer) Ouvrir 2 fenêtres de commandes qui correspondront à 2 processus shell différents, chacun ayant un numéro de processus qui l'identifie de manière unique. 1. Il est possible d'afficher le numéro du processus shell associé à une fenêtre en tapant l'une des commandes suivantes : ps (sans paramètres) : on voir l'identification du processus bash (le shell) et l'identification du processus qui vient de réaliser la commande ps echo $$ : la variable $$ du shell contient le numéro du shell courant 2. Envoyer 9 le signal 1 à l'une des fenêtres, à partir de l'autre : kill -1 < No du processus visé > Que se passe-t-il? le processus est tué 3. Modifier le comportement du processus bash à la réception du signal 1 en tapant la commande suivante : trap 'uptime' 1 La commande trap (sans paramètres) permet de voir les actions associées aux signaux 10 4. Envoyer le signal 1 à la fenêtre dans laquelle on a tapé la commande trap précédente, soit à partir d'une autre fenêtre: kill -1 < No du processus visé > soit à partir de la fenêtre courante : kill -1 $$ Que se passe-t-il? la commande uptime est exécutée 5. Comment faire pour que le processus shell écrive "j'ai reçu le signal 3" dans le fichier ~/signal3 à chaque fois qu'il reçoit ce signal? On souhaite voir, dans ce fichier, autant de lignes que de signaux 3 reçus. On souhaite aussi que les lignes soient datées (utiliser le résultat 11 de la commande date) trap 'echo " `date` : signal 3 reçu " >>~/signal3' 3 6. Est-il possible de redéfinir l'action associée au signal 9? essayer en utilisant trap 'ls -l' 9 ; trap et envoyer le signal 9 au processus Que se passe-t-il? le processus est tué, donc le signal 9 n'a pas été véritablement redéfini Interprétation 12? Les signaux SIGKILL=9 et SIGSTOP=19 ne peuvent être redéfinis 9 Attention : si vous n'êtes pas superviseur (root ) vous ne pouvez pas envoyer de signaux aux processus qui ne vous appartiennent pas 10 Les signaux sont ici définis non par leur numéro mais par la constante associée. La liste des constantes représentant les numéros de signaux est donnée par la commande kill -l 11 Le shell permet de "capturer" la sortie écran d'une commande en encadrant cette commande par les caractères `` obtenus au clavier par Alt Gr + 7. La commande echo " aujourd'hui `date` " > /tmp/bonjour permet ainsi d'écrire le mot aujourd'hui suivi de la date du jour dans le fichier /tmp/bonjour 12 voir man 2 signal et rechercher dans la page SIGKILL et SIGSTOP TP N 2 Unix / Linux ICASE 7 / 9 Groupe esaip
Notes i When bash is invoked as an interactive login shell, or as a noninteractive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior. ii JUMPING g < ESC-< * Go to first line in file (or line N). G > ESC-> * Go to last line in file (or line N). 25p * Go to 25 percent into file TP N 2 Unix / Linux ICASE 8 / 9 Groupe esaip