Aller au contenu

Environnement de Travail du CREMI

Au programme :

  • Editeurs de commandes (shell)
  • Système de gestion de fichiers Unix
  • Système de gestion de processus
  • Archivage de fichiers

Remerciements

Merci à l'UF d'info et tout particulièrement à Aurélien Esnard, Laurent Reveillere et Pierre-Andre Wacrenier pour le partage de ressources (ce tutoriel s'inspire des niveaux 2 et 4 du stage environnement de travail proposé par l'UF info : https://stage-env.gitlabpages.inria.fr/support/index.html)

Interpréteur de commandes Bash

Introduction

Un interpréteur de commandes est un processus dont le rôle est de fournir une interface textuelle avec le système d'exploitation. Il peut être lancé dans une fenêtre (appelée terminal ou console) ou directement lorsqu'on travaille sans interface graphique (de haut niveau). Un peu de vocabulaire : les interpréteurs de commandes Unix sont appelés des shells.

  • Lancez un interpréteur de commande en cliquant sur l'icône symbolisant un écran d'ordinateur (des années soixante).
  • Tapez ce qu'il vous passe dans la tête puis la touche entrée, simplement pour voir ce qu'il se passe.

Image Shell

Un interpréteur de commandes en mode console exécute en boucle la séquence d'actions suivante :

  • affichage de l'invite de commande (prompt) signalant qu'il est en attente d'une nouvelle commande de la part de l'utilisateur ;
  • aide à la saisie de la nouvelle commande, en fournissant à l'utilisateur des fonctions d'édition de texte en mode ligne : accès à l'historique des commandes précédentes, copie et remplacement rapides, complétion de noms de fichiers, etc. ;
  • analyse et vérification syntaxique de la commande tapée par l'utilisateur, et affichage d'un message d'erreur en cas de problème ;
  • si la commande est conforme, un appel au système d'exploitation est effectué pour réaliser les opérations demandées : lancement d'un nouveau processus, etc. ;
  • attente de la fin de la commande en cours.

Plus d'info : http://fr.wikipedia.org/wiki/Bourne-Again_shell

Édition des Commandes

Dans une utilisation interactive du shell, c’est-à-dire lorsque le shell interprète ligne à ligne les commandes soumises par l'utilisateur, il est important de pouvoir corriger au besoin la ligne de commande avant de la soumettre. Cela se fait à l'aide de commandes similaires à celles d'un éditeur de texte (déplacement du curseur, suppression de caratères, etc).

  • Tapez who puis sur la touche Enter, puis recommencez avec la commande whoami.
  • Tapez la commande cal suivi de votre année de naissance puis sur la touche Enter.
  • Tapez whoa puis sur la touche de tabulation (Tab, à gauche du clavier avec les deux flèches en sens opposés) puis sur entrée. Cela permet ainsi de compléter automatiquement sans avoir besoin de tout taper. C'est très efficace quand on en prend l'habitude !

Il existe plusieurs manières de rechercher une commande déjà utilisée dans l'historique des commandes.
La commande history affiche à l'écran les (quelques 2000 ?) dernières commandes qui ont été utilisées, chacune d'elles précédée par un numéro. Il est possible de relancer la commande en tapant son numéro précédé par un ! dans un terminal.
La combinaison Ctrl-r suivie d'une chaîne de caractères vous permet de rechercher la dernière commande utilisée contenant cette chaîne de caractères. En tapant de nouveau plusieurs fois sur Ctrl-r, vous pourrez parcourir l'ensemble des commandes utilisées contenantette chaîne de caractères.
Enfin, l'utilisation des flèches haut et bas vous permet également de parcourir l'historique récent des commandes utilisées.

  • Tapez la commande history et consultez les dernières commandes utilisées.
  • Retrouvez le numéro de la dernière utilisation de la commande cal puis tapez dansle terminal !num où vous remplacerez num par le numéro de la commande.
  • Tapez la combinaison de touches Ctrl-r puis la lettre w. Tapez plusieurs fois Ctrl-r pour retrouver l'utilisation de la commande who. Une fois trouvée, tapez sur la touche Enter.
  • Utilisez les touches de déplacement du curseur pour naviguer dans la ligne de commande ainsi que dans l'historique des commandes.

Quelle que soit la position du curseur sur la ligne de commande, la touche Enter lance l'interprétation de la ligne par le shell. Une autre possibilité de bash, qui concerne encore une fois la construction d'une commande, permet la complétion du mot commencé grâce à la touche Tab.

  • Tapez cd puis tapez deux fois la touche Tab pour voir l'action de la complétion.
  • Complétez l'argument de votre commande avec les caractères es : cd es puis tapez une seule fois sur Tab. Constatez le résultat.

Format et manuel d'une commande

Voici la syntaxe classique d'une commande Unix (ici appelée cmd, à remplacer par les noms de commandes décrites plus bas) :

cmd [-opt1] [-opt2] ... [--] arg1 arg2 ...

où :

  • cmd correspond au nom de la commande ;
  • -opt correspond à une option possible (les crochets [], indiquant que c'est une option, n'apparaissent pas lors de l'écriture de la commande ;
  • arg correspond à un argument.

Notons que les arguments sont le plus souvent un nom de fichier que la commande manipule. On peut utiliser -- pour séparer explicitement les options des arguments quand la commande est ambiguë.

  • Tapez les commandes
    ls ~/.bash*
    ls -l ~/.bash*

Pour obtenir l'aide en ligne, et notamment ce que permet de faire une commande, il suffit d'utiliser le manuel accessible avec la commande man.

  • Tapez
    man ls

Faire défiler avec les flèches haut/bas, utiliser "q" pour quitter. Pour chercher plus rapidement ce qui vous intéresse, taper "/" puis le texte à chercher, puis entrée, ce qui vous amène à la première occurrence. Pour passer aux occurrences suivantes, taper "n" (comme next).

Attention ! L'aide est écrite en anglais et les version traduites sont souvent de moindre qualité. Un conseil : s'habituer dès maintenant à lire la documentation en anglais ;-)

  • Demandez l'aide de la commande mkdir.
  • Demandez l'aide de la commande man.

Par la suite, si vous vous posez des questions sur une commande n'hésitez plus à consulter le manuel.

Système de Gestion de Fichiers Unix

Introduction

Le système de gestion de fichiers (SGF) d'Unix procure à l'utilisateur un moyen efficace pour conserver et manipuler aisément des informations. En outre, il offre un système de sécurité, notamment sur les droits d'accès aux fichiers. Il existe trois principaux types de fichiers :

  • les fichiers de données (ordinary files),
  • les répertoires (directories),
  • les périphériques (devices).

Ce SGF est simple et permet de manipuler de manière uniforme les fichiers comme les périphériques. Sous Unix, on a coutume de dire que "tout est fichier !".

Le système de gestion de fichiers utilise une structure hiérarchique (arborescence) composée de répertoires et de fichiers. Chaque répertoire contient des fichiers ordinaires ou d'autres répertoires.

   /
   ├──net/
   │   ├── cremi/
   │   │   ├── A/
   │   │   ├── B/
   │   │   │   └── quux
   │   │   └── C/
   |   :
   ├──etc/
   |   ├── ...
   :   :
   ├──boot/
   :   :

Par convention, on identifie un répertoire en ajoutant un / à la fin de son nom, même s'il ne fait pas partie de celui-ci. Ainsi dans la hiérarchie précédente, cremi est un (sous-)répertoire contenu dansle répertoire net.

Nom de Fichier

Les noms de fichiers sont limités à 256 caractères sous Unix. De préférence, n'utilisez pas d'espace mais "_" ou "-" à la place. Evitez les caractères spéciaux (&, @, $, #, ...). Le plus simple est de toujours utiliser des lettres et des chiffres.

Attention le système Unix fait la différence entre majuscules et minuscules ! Les fichiers toto, Toto et TOTO ont des noms différents, contrairement à Windows.

L'extension ou suffixe (optionnel) fait partie du nom, il commence par . et n'a pas de limite de taille (.txt, .html, .tar.gz, .ps.gz, etc.). Il permet d'indiquer le type du fichier. Il ne s'agit que d'une convention sous Unix. Aussi changer l'extension d'un fichier ne modifie pas son contenu : c'est simplement un changement de nom qui peut, cependant, modifier le comportement des programmes tenant compte des extensions.

Pour connaître le type d'un fichier, il faut utiliser la commande file. Par exemple :

  • Tapez les commandes
    file ~/.bashrc
    file ~/Documents

Les fichiers dont le nom commence par un . (tel que .bashrc) sont considérés comme des fichiers cachés. Ils n'apparaissent pas par défaut lorsqu'on liste les fichiers d'un répertoire. Ce sont générallement des fichiers de configuration.

Les répertoires

Il existe un certains nombre de répertoires particuliers :

/    racine de l'arborescence,
.    répertoire courant,
..   répertoire père du répertoire courant,
~    votre répertoire utilisateur (home directory)

Votre répertoire utilisateur, également appelé répertoire de connexion, est en quelque sorte votre maison (home), c'est à dire là où vous pouvez stocker vos fichiers. Au CREMI, sauf changement de votre part, vous êtes le seul à pouvoir y accèder et le modifier.

Chemins Relatif et Absolu

Un chemin (path) est la succession de répertoires qu’il faut traverser jusqu’à l’objet que l’on veut atteindre. Ce chemin peut être absolu s’il part de la racine (notée /) du système de fichier, ou encore relatif s’il part du répertoire d’où l’on effectue la commande (répertoire courant du processus exécutant la commande).

   /
   ├──net/
   │   ├── cremi/
   │   │   ├── A/
   │   │   ├── B/
   │   │   │   └── quux
   │   │   └── C/
   |   :
   ├──etc/
   |   ├── ...
   :   :
   ├──boot/
   :   :

Ainsi /net/cremi/B/quux est un chemin absolu qui désigne le fichier quux. Le chemin relatif ../B/quux désigne le fichier quux lorsque le répertoire courant est soit /net/cremi/A, soit /net/cremi/B ou encore /net/cremi/C. Notons également que le chemin quuxdésigne le fichier quux lorsque le répertoire courant est /net/cremi/B.

Quelques mots sur le SGF du CREMI

Le SGF du CREMI est réparti sur les disques des machines de travail et différents ensembles de disques de données (baies de stockage) pour des raisons de performance, de coût, de sécurité et de fiabilité. Votre répertoire d'utilisateur est stocké sur la baie la plus rapide, cependant vous n'avez droit d'y conserver que 2000 Mo de données. Pour stocker jusqu'à 75Go, vous pouvez utiliser le répertoire ~/espaces/travail qui désigne un répertoire stocké sur une baie un peu plus lente mais de capacité supérieure.

   ├── ~
   │   ├── espaces/
   │   │   ├── doc/
   │   │   ├── ens/
   │   │   ├── travail/  # stockez ici tous vos projets
   │   │   └── www/

Le SGF du CREMI est présenté dans cet article https://services.emi.u-bordeaux.fr/intranet/spip.php?article6 où l'on vous indique, par exemple, où stocker vos pages html pour les publier sur le web du CREMI.

Gestion de l'arborescence

Les principales commandes permettant de gérer une arborescence de répertoires sont les suivantes

cd     changer de répertoire courant (change directory)
mkdir  Crée un répertoire (make directory)
rmdir  Supprime un répertoire (remove directory)
ls     Liste le contenu d'un répertoire (list)
pwd    Affiche le chemin du répertoire courant (path working directory)
du     Affiche la taille du répertoire courant et de tous ses sous-répertoires
  • Dans quel répertoire se trouve l'interpréteur de commande ?
  • Listez les fichiers contenus dans ce répertoire.
  • Tapez la commande cd. Cette commande, sans argument, a pour effet de vous re-positionner dans votre répertoire utilisateur.
  • Que fait la commande ls -a ?
  • Que fait la commande ls -l ?
  • Combinez les options l et h afin d'avoir un affichage plus clair de la taille de vos fichiers : ls -lh
  • Tapez la commande du -h

Les caractères suivants ont une signification particulière pour l'interpréteur de commandes (i.e. le shell) : ? * [ ] \ ˜.

  • le caractère ? permet de remplacer un caractère quelconque ; par exemple, la commande ls fic? donnera tous les noms de quatre lettres dont les trois premières sont fic ;
  • le caractère * remplace n'importe quelle chaîne de caractères (y compris la chaîne vide) ; par exemple, la commande ls fic* donnera tous les noms de trois lettres ou plus, dont les trois premières lettres sont fic ;
  • une suite de caractères entre crochets [ ] désigne un seul caractère de la suite ; par exemple, en supposant que vous disposiez dans votre répertoire courant des fichiers fic1, fic2 et fic3, alors ls fic[123] sera équivalent à ls fic1 fic2 fic3 ;
  • deux caractères séparés par un - entre crochets [ ] (par exemple [a-e]) désigne un seul caractère de l'intervalle de caractères ; par exemple, en supposant que vous disposiez dans votre répertoire courant des fichiers fica, ficb, ficc, ficd, et fice, alors la commande ls fic[a-e] est équivalente à ls fica ficb ficc ficd fice.
  • Déplacez-vous dans le répertoire /bin (ou /usr/bin) avec la commande cd.
  • Listez tous les fichiers dont le nom commence par r
  • Listez tous les fichiers dont le nom finit par e
  • Listez tous les fichiers dont le nom contient mod

  • Revenez dans votre répertoire utilisateur.

  • Créez un répertoire AOT avec la commande mkdir
  • Déplacez-vous dans ce répertoire avec la commande cd
  • Créez un répertoire TOTO dans le répertoire AOT et déplacez-vous dedans.
  • Revenez dans le répertoire AOT avec la commande cd .. (Rappel : .. est le répertoire père du répertoire courant.)
  • Supprimer le répertoire TOTO avec la commande rmdir

Edition de fichiers

libreoffice Logiciel de traitement de texte
kate        Editeur de texte
less        Affiche le contenu de fichiers de façon interactive

Il est important de différencier les logiciels de traitement de texte et les éditeurs de texte. Les premiers, tels que Microsoft Word, LibreOffice ou encore OpenOffice, enregistrent les documents dans un format élaboré, souvent propriétaire, contenant les informations de mise en page, de formatage du texte, etc. Seuls des logiciels de traitement de texte peuvent consulter ces fichiers. Quant aux éditeurs de texte, tels que gedit, kate ou encore emacs, ils sauvegardent les documents sour la forme de fichiers textes natifs sans auncune mise en forme comme une simple succession de caractères. Ces fichiers peuvent être consultés avec de simples commandes.

  • Dans le répertoire AOT, lancez la commande kate adresse.txt
  • Dans la fenêtre qui s'ouvre, tapez vos nom, prénom et adresse mail. Enregistrez et quittez.
  • Dans la fenêtre de commandes, vérifiez la présence du fichier adresse.txt dans le répertoire AOT.
  • Affichez le contenu du fichier adresse.txt avec la commande less
  • En passant par les menus de linux, ouvrez un nouveau document LibreOffice ; entrez-y vos nom, prénom et adresse mail ; enregistrez-le avec le nom adresse.odt dans votre répertoire AOT ; et quittez.
  • Dans la fenêtre de commandes, vérifiez la présence du fichier adresse.odt dans le répertoire AOT.
  • Affichez le contenu du fichier adresse.odt avec la commande less. Que se passe-t-il ?

Manipulation de Fichiers

cp    Copie des fichiers ou des répertoires (copy)
mv    Déplace ou renomme un fichier ou un répertoire (move)
rm    Supprime un fichier (remove)

Pour les questions suivantes, vérifiez les résultats des commandes en listant les fichiers des différents répertoires concernés.

  • Copiez le fichier adresse.txt dans votre répertoire utilisateur avec la commande cp
  • Dans le répertoire AOT, créez un répertoire config.
  • Copiez tous les fichiers finissant par .conf du répertoire /etc/ dans le répertoire config que vous venez de créer. Utilisez la commande mv et le caractère * présenté dans la section "gestion de l'arborescence".
  • Dans votre répertoire config, supprimez en une seule commande tous les fichiers contenant la séquence de lettres er
  • Déplacez-vous dans votre répertoire utilisateur.
  • Renommez le fichier adresse.txt en .signature

Attention !!! : N'utilisez jamais, sauf en toute connaissance de cause, la commande rm -r *. Cette commande supprimera tout le contenu du répertoire courant (dont tous les sous-répertoires). C'est le meilleur moyen de perdre toutes vos données.

Système de gestion de processus

Introduction

En première approche, un processus est une occurrence d'un programme en cours d'exécution. Les processus ont en quelque sorte une vie ; ils naissent (lorsque vous lancez un programme ou tapez une commande), ils vivent (lorsqu'ils s'exécutent) et meurent (lorsqu'ils ont terminé leur exécution). A leur naissance, chaque processus se voit attribuer par le système un PID unique (process identifier), il s'agit d'un entier identifiant le processus. Ainsi, à un instant donné, tous les processus vivants ont un PID différent, qui permet de les identifier sans ambiguïté. Enfin, lorsqu'un processus meurt, son PID redevient disponible et pourra être réattribué par le système à un nouveau processus.

Gestion des processus

bg     Relancer en arrière plan un processus stoppé
fg     Mettre en avant plan un processus
ps     Lister les processus occupant le terminal et/ou la machine
top    Observer et gérer les processus occupant la machine
kill   Envoyer un signal à un processus ou à un groupe de processus
Ctrl-z suspend un processus en premier plan
Ctrl-c tue un processus en premier plan 

Comme indiqué en début de document, lorsqu'une commande est lancée, un processus est créé et s'exécute sur le processeur. L'interpréteur de commande attend la fin du processus pour redonner la main à l'utilisateur. On dit que le processus est en premier plan (foreground) sur le terminal de commande. Il est possible de lancer un nouveau processus ou de placer un processus arrếté en arrière plan afin de garder la main sur le terminal de commande.

  • Tapez la commande xeyes. Avez-vous toujours le contrôle de votre terminal ?
  • Notez le comportement de xeyes en fonction du déplacement de votre pointeur.
  • Testez la commande Ctrl-c dans votre terminal. Que s'est-il passé ?
  • Relancez xeyes dans votre terminal.
  • Testez maintenant la commande Ctrl-z dans votre terminal. Que se passe-t-il
    dans le terminal ?
    dans xeyes ?
  • Testez la commande fg dans le terminal. Que se passe-t-il ?
  • Interrompez à nouveau le processus avec Ctrl-z. Testez la commande bg. Que se passe-t-il avec xeyes ? Avez-vous toujours le contrôle de votre terminal ?
  • Testez la commande ps. Avez-vous trouvé le PID de votre processus xeyes ?
  • Tuez le processus xeyes avec la commande kill -9 numpid où vous remplacez nnumpid par le PID de xeyes. Quel est le résultat ?
  • Testez la commande ps -ef. Elle permet de lister l'ensemble des processus en train de s'exécuter sur l'ordinateur.

Notez qu'il est possible de lancer un processus directement en arrière plan (sans combiner Ctrl-z puis bg) en ajoutant simplement un & à la fin de la commande.

  • Tapez la commande xeyes &
  • Constatez la mise automatique en arrière plan de xeyes
  • retrouvez le PID de xeyes et tuez-le.

Les Mécanismes de Redirection

Sous Unix, les processus peuvent lire et écrire sur la console. Techniquement cela se fait au moyen de fichiers. Par défaut un processus lancé depuis la console exploite trois fichiers :

  • un fichier pour lire les caractères écrits depuis le clavier sur la console ;
  • un fichier pour écrire les affichages demandés par le processus sur la console ;
  • un fichier pour écrire sur la console les messages d'erreurs rapportés par le processus.

Ces trois fichiers sont appelés repectivement entrée standard (par défaut un fichier correspondant au périphérique clavier), sortie standard (par défaut un fichier correspondant au périphérique écran), et sortie d'erreur standard (par défaut un fichier correspondant au périphérique écran) du processus. Il est possible de modifier, de rediriger, l'entrée et les sorties standards d'un processus :

cmd < file   # 'cmd' utilise le contenu de 'file' comme entrée standard
cmd > file   # Écrit la sortie de ’cmd’ en écrasant le fichier ’file’
cmd >> file  # Écrit la sortie de ’cmd’ en l’ajoutant à la suite du fichier ’file’
cmd 2> file  # Écrit la sortie d’erreur de ’cmd’ dans ’file’
cmd &> file  # Écrit la sortie standard et d’erreur de ’cmd’ dans ’file’

Ces commandes permettent surtout de rediriger dans un fichier les résultats d'une commande générant beaucoup de lignes tels que les compilations de gros programmes.

Dans un terminal

  • Déplacez-vous dans le répertoire AOT
  • Exécutez la commande ps -ef
  • Réexécutez la commande en redirigeant la sortie standard dans un fichier dont le nom est output
  • Vérifiez l'existence du fichier output dans votre répertoire. Vous pouvez consulter son contenu (par exemple avec la commande less vue plus haut)

Recherche de chaînes de caractères

grep  Recherche de motifs dans un ensemble de fichiers
  • Recherchez l'ensemble des lignes contenant votre nom d'utilisateur dans le fichier output avec la commande grep login output où vous remplacerez login par votre nom d'utilisateur.

Enchaînement des Processus

cmd1 ; cmd2   # Exécute cmd1 puis cmd2
cmd1 & cmd2   # Exécute cmd1 et cmd2 en parallèle
cmd1 | cmd2   # Exécute cmd1 et cmd2 en parallèle en redirigeant la sortie standard de cmd1 vers l'entrée standard de cmd2
  • Lancez la commande ls -l /usr/bin > output ; cat -n output ; rm output

Si on regarde attentivement ligne de commande, on se rend compte que :

  1. ls -l /usr/bin > output écrit dans le fichier output par redirection de la sortie standard la liste des fichiers du répertoire /usr/bin ;
  2. cat -n lit dans le fichier output et affiche le résultat en numérotant les ligne ;
  3. output sert de fichier temporaire et peut être supprimé à l'issue du cat.

Il est possible de faire bien mieux car Unix met à votre disposition un mécanisme particulier appelé tube (pipe en anglais). C'est un opérateur permettant de connecter directement la sortie standard d'un premier programme à l'entrée standard d'un second sans devoir spécifier de fichier temporaire tout en les exécutant en parallèle. L'opérateur de pipe est |. Exemple : Reprenons l'exemple précédent, et réécrivons-le en utilisant cette fois-ci un pipe :

  • Tapez la commande ls -l /usr/bin | cat -n

Le processus exécutant ls -l /bin envoie son résultat sur l'entrée standard du processus cat -n, ainsi, il n'est plus nécessaire d'utiliser un fichier temporaire comme dans l'exemple précédent (fichier output). Un tube offre un mécanisme de communication puissant qui permet d'échanger des informations entre processus. Il faut bien comprendre que, contrairement à l'enchaînement séquentiel des processus, lors de l'exécution de commande-1 | commande-2, deux processus sont créés puis s'exécutent simultanément en se synchronisant.

                   ---------------------------
 Processus 1 ---> (           TUBE           () ---> Processus 2
                   ---------------------------
  (Ecriture)                                          (Lecture)
  • Combinez le résultat de la commande ps -ef avec la commande less afin de parcourir facilement la liste des processus de l'ordinateur.
  • Combinez cette fois-ci la commande ps -ef avec la commande grep afin de ne faire apparaître que les processus qui vous appartiennent.

Archivage

L'utilitaire tar permet d'archiver et de compresser des fichiers en une archive de taille réduite, utile pour transférer le fichier par mail ou par clé à un autre utilisateur, ou tout simplement sauvegarder ses données sur un support électronique.

Ainsi, la commande :

tar -zcvf src.tar.gz source_dir
permet d'archiver (avec tar) puis de compresser (avec gzip) tout le répertoire source_dir (et son contenu) en un fichier src.tar.gz.

Pour lister le contenu d'une archive, on peut utiliser la commande

tar -ztf src.tar.gz

Enfin, pour extraire le contenu d'une archive à l'endroit où elle se trouve, on utilisera la commande

tar -zxvf src.tar.gz

Dans votre répertoire utilisateur :

  • Archivez et compressez votre répertoire AOT en un fichier sauve.tar.gz
  • Vérifiez l'existence et le contenu de votre archive sauve.tar.gz
  • Supprimez le répertoire AOT
  • Vérifiez qu'il a bien été supprimé
  • Restaurez-le à partir de l'archive sauve.tar.gz

Nettoyage

Vous pouvez maintenant nettoyer votre répertoire utilisateur en supprimant le fichier sauve.tar.gz ainsi que le répertoire AOT.