Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation CHAPITRE 4 : GESTION DES PROCESSUS 4.1 Les processus sous Unix Unix est un système multi-tâches, c'est-à-dire qu'il peut exécuter plusieurs programmes à la fois. Un processus est une instance d'un programme en train de s'exécuter, une tâche. Le shell crée un nouveau processus pour exécuter chaque commande. 4.1.1 Mettre un processus en tâche de fond Si on lance une commande qui prend beaucoup de temps (comme un calcul, ou une nouvelle fenêtre), on peut l'interrompre par Control-C. Ceci interrompt (définitivement) la commande. On peut aussi exécuter une commande en tâche de fond. Le shell rend alors la main avant la fin de la commande. Pour le faire, on ajoute un & à la fin de la commande ; par exemple : $ cc -o grosprogramme grosfichier.c & $ xdvi monrapport.dvi & Dans le premier exemple, on lance le compilateur cc en parallèle avec le shell; dans le second exemple, on met le dvi en tâche de fond, ce qui évite d'avoir à le relancer à chaque modification. On reprend la main immédiatement, sans attendre la fin de l'exécution de la commande. On peut donc taper d'autres commandes dans le même terminal, pendant que la précédente s'exécute. 4.1.2 background et foreground Comme on vient de le voir, si vous avez pensé à terminer votre ligne de commande par une esperluette, le programme que vous avez lancé tourne en arrière-plan (background, abrégé en bg). Si vous avez omis l'esperluette, le programme prend la précédence sur le shell. On dit qu'il tourne au premier plan (foreground, abrégé en fg). Les lignes tapées au clavier sont mémorisées mais ne seront pas exécutées par le shell avant que le programme en cours d'exécution n'ait fini son calcul. Vous pouvez malgré tout faire passer ce programme en tâche de fond, grâce à la manipulation suivante : $ xdvi rapport.dvi ^Z zsh: suspended xdvi rapport.dvi $ bg [1] + continued xdvi rapport.dvi $ ^Z est un signal intercepté par le shell, qui suspend l'exécution du programme sans détruire le processus correspondant. Les calculs déjà effectués par ce programme ne sont pas perdus. Dans l'exemple précédent, si on demande à un xdvi suspendu de changer de page (SPC), il ne Pr BELKHIR A Dpt Informatique 2ème année Licence GTR Faculté Electronique et Informatique UASE : Utilisation et Administration USTHB des Systèmes d’Exploitation le fera pas, mais il se souviendra de le faire dès qu'il aura à nouveau accès aux ressources de l'ordinateur. À partir de l'état suspendu, on peut faire passer un programme : au premier plan, en tapant fg ; en arrière-plan, en tapant bg. Son exécution reprend alors là où on l'avait laissée. Quand il n'y a qu'un seul programme en arrière-plan dans le terminal courant, on peut le faire passer au premier plan en tapant fg. Cela permet en particulier d'interrompre son exécution grâce à ^C, que la plupart des programmes comprennent.^C n'affecte que l'éventuel unique programme qui tourne au premier plan dans le terminal où il est tapé. Quand il y en a plusieurs, c'est un peu plus compliqué, mais c'est bien sûr possible. Résumé : Le programme tourne au premier plan : o ^Z le suspend ; o ^C l'interrompt. Le programme est suspendu : o fg le passe au premier plan ; o bg le passe en arrière-plan. Le programme tourne en arrière-plan : o si c'est le seul dans ce cas, fg le passe au premier plan ; o sinon, c'est plus compliqué. Le programme ne tourne pas : o il n'y a rien à faire... 4.2 Voir les processus Chaque processus est associé un certain nombre d’informations. Ces informations contribuent à l’identification et la gestion du processus. On dénote : - numéro de processus PID (Process Identifier) - numéro d’utilisateur UID (User IDentifier) - numéro de groupe GID (Group IDentifier) - durée de traitement utilisée (temps cpu) et priorité du processus - référence au répertoire de travail courant - table de référence des fichiers ouverts - PID (Process Identifier) : le système étant multi-tâche, le PID est moyen d’identifier tout processus dans le système. Chaque processus peut créer lui-même des processus ; ces nouveaux processus sont alors appelés processus fils. Ces derniers connaissent leur origine par l’intermédiaire de PPID (PID du père) Pr BELKHIR A Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation UID et GID : Chaque processus dispose des numéros UID et GID à sa création. Ce qui lui permettra d’avoir les autorisations d’accès aux fichiers. Durée de traitement et priorité : La stratégie de scheduling est une variante de Roud Robbin basée sur les priorités. Ce qui permettra de partager le temps CPU entre les processus. Répertoire courant du processus : il indique le répertoire courant de travail et d’accès aux fichiers. Table des fichiers ouverts : elle permet l’accès aux fichiers en lecture et écriture. Les trois premières entrées sont prédéfinies : stdin (clavier), stdout (écran) et stderr (écran pour erreur). Les priorités des processus créent un phénomène appelé "ordonnancement " lié à la gestion de la mémoire. Le temps de processeur total disponible est divisé en petites plages : le quantum. Un processus ne peut rester dans le processeur que le temps d'un quantum. La commande ps montre où en sont les tâches de fond : $ ps PID TT STAT TIME COMMAND 4450 p9 S 0:00 /usr/local/bin/lcsh 4782 p9 S 0:02 cc -o grosprogramme grosfichier.c Pr BELKHIR A Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation 4841 p9 R 0:00 ps ps affiche la liste des processus que vous avez lancés : PID (process identificator) : c'est le numéro du processus. TT : indique le terminal dans lequel a été lancé le processus. Un point d'interrogation signifie que le processus n'est attaché à aucun terminal (par exemple les démons). STAT : indique l'état du processus : o R : actif ( running) o S : non activé depuis moins de 20 secondes (sleeping) o I : non activé depuis plus de 20 secondes (idle) o T : arrêté (suspendu) o Z : zombie TIME : indique le temps machine utilisé par le programme (et non pas le temps depuis lequel le processus a été lancé !). La commande ps a différentes options, dont les suivantes : a (all) : donne la liste de tous les processus, y compris ceux dont vous n'êtes pas propriétaire. g (global, général...) : donne la liste de tous les processus dont vous êtes propriétaire. u (user, utilisateur) : donne davantage d'informations (nom du propriétaire, heure de lancement, pourcentage de mémoire occupée par le processus, etc.). x : affiche aussi les processus qui ne sont pas associés à un terminal. w : le tronque pas à 80 caractères (peut être utilisée plusieurs fois pour tronquer plus loin) ps agux est en fait souvent utilisé pour avoir des informations sur tous les processus. La commande top affiche les mêmes informations, mais de façon dynamique : elle indique en fait par ordre décroissant le temps machine des processus, les plus gourmands en premier. 4.3 Tuer les processus Les programmes ont tous une commande spécifique pour les quitter ( q, menu où cliquer, etc). C'est seulement dans le cas où vous ne parvenez pas à les quitter correctement, pour une raison ou une autre, que vous pouvez avoir besoin de tuer le processus. Avant toute chose, essayez de taper ^C ou ^D. Si cependant ça ne marche pas, utilisez la commande kill (plus le numéro du processus). $ ps PID TT STAT TIME COMMAND 4450 p9 S 0:00 /usr/local/bin/lcsh 4782 p9 S 0:02 cc -o grosprogramme grosfichier.c 4841 p9 R 0:00 ps $ kill 4782 $ ps PID TT STAT TIME COMMAND 4450 p9 S 0:00 /usr/local/bin/lcsh 4851 p9 R 0:00 ps Pr BELKHIR A Dpt Informatique 2ème année Licence GTR Faculté Electronique et Informatique UASE : Utilisation et Administration USTHB des Systèmes d’Exploitation kill -9 tue le processus à tous les coups. Vous ne pouvez tuer que les processus dont vous êtes propriétaire. Il convient de ne l'utiliser que si aucune autre méthode ne marche, car dans ce cas le programme n'a aucun moyen de faire quoi que ce soit avant de mourir. . Commandes liées aux processus fork : allocation d'une entrée dans la table de processus. duplication de la zone u. portage du code et des données. copy on write (lorsqu'une modification intervient, il y a copie du processus). exec : on libère tout sauf l'entrée dans la table des processus et la zone u. allocation des zones texte, données, pile et tas pour le programme chargé. exit : on libère tout sauf l'entrée dans la table des processus (processus en état zombie). exit (n) retourne un code de sortie (n) qui pourra être récupéré par le père. wait : attente de terminaison du fils, s'il n'est pas encore terminé. récupération des informations sur la terminaison du fils (code de sortie). disparition définitive du fils. 6.3.2. top top est un programme tout en un : il remplit à la fois les fonctions de ps et kill. C’est un programme en mode console, vous le lancerez donc depuis un terminal. Pr BELKHIR A Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation Figure 6-1. Exemple d’exécution de top Le programme se contrôle entièrement au clavier. Une aide est disponible en tapant sur h, mais elle est en anglais. Voici donc quelques-unes des commandes disponibles : • k : sert à envoyer un signal à un processus. top vous demandera alors le PID du processus suivi du numéro du signal à envoyer (15 par défaut) ; • M: trie par taux d’occupation mémoire (champ %MEM) • P : sert à trier les processus selon le temps CPU qu’ils consomment (champ %CPU : c’est le tri par défaut) ; • u : cette commande sert à afficher les processus d’un utilisateur donné, top vous demandera lequel. Vous devez entrer le nom de l’utilisateur, pas son UID. Si vous n’entrez aucun nom, tous les processus seront affichés ; • i : cette commande fonctionne en tant que bascule. Par défaut, tous les processus, même endormis, sont affichés. Cette commande fera que seuls les processus en cours d’exécution seront affichés (processus dont le champ STAT indique R, running, soit en cours d’exécution) mais pas les autres. Un nouvel appel à cette commande permettra de revenir à l’état antérieur. La commande top affiche une page d'information, périodiquement mise à jour (taper q pour quitter), pour gérer les processus et être informé de la charge de travail du CPU et de l'utilisation mémoire. L'équivalent graphique existe sous X-KDE, lancer K/système/gestionnaire de taches Ktop Crontab : planification des tâches Fonctionnement et syntaxe Crond est un service qui exécute toutes tâches (commandes et scripts) pour les utilisateurs. (cron vient de chronos). Il est possible de planifier ces tâches à l'avance et même de les faire lancer périodiquement. On peut obtenir l'émission de messages de compte-rendu de ces tâches. Pr BELKHIR A Dpt Informatique 2ème année Licence GTR Faculté Electronique et Informatique UASE : Utilisation et Administration USTHB des Systèmes d’Exploitation La commande /usr/bin/crontab permet cette programmation. Son usage est en principe réservé à root. On peut toutefois autoriser certains utilisateurs. Pour cela on en dresse la liste sur des lignes successives dans le fichier /etc/crond.allow , de façon symétrique, on peut mettre dans /etc/crond.deny la liste des utilisateurs non autorisés. o o o o Exemple : seuls jean et toto ont la permission d'utiliser le service crontab # ll cron.allow Jean toto Fonctionnement o Le processus crond est normalement lancé au démarrage. On peut le lancer ou l'arrêter avec /etc/rc.d/init.d/crond o Il lit toutes les minutes les fichiers présents dans le répertoire /var/spool/cron (et aussi le fichier /etc/crontab, pour voir si des tâches doivent être exécutées. o Chaque action de crond ajoute une ligne de message dans le fichier /var/log/cron, qu'il faut purger de temps en temps ... par une commande crontab ! o Par défaut si une commande produit un affichage, il est dirigé vers la messagerie Commande crontab [-u user] {-l | -r | -e } Modifier le fichier /etc/crontab Options : o o o crontab -l affiche le fichier crontab de l'utilisateur crontab -r efface ce fichier crontab -l -u jean root examine le fichier crontab crontab -e dans vi de l'user jean crée ou édite (pour modification) un fichier temporaire dans /tmp ouvert Syntaxe des lignes des tables crontab Chaque ligne du fichier contient 6 champs, les 5 premières déterminent les moments d'exécution de la tâche décrite au 6ème champ. o o les 5 premiers, séparés par des espaces, appelés champs temporels, décrivent la périodicité : minutes (0-59), heures (0-23), jour du mois (1-31), mois de l'année (1-12), jour de la semaine (0-6, 0= dimanche) le 6ème est la commande à exécuter, ce peut être naturellement un script quelconque Pr BELKHIR A Dpt Informatique 2ème année Licence GTR Faculté Electronique et Informatique UASE : Utilisation et Administration USTHB des Systèmes d’Exploitation o un champ temporel peut contenir : une valeur précise et valide pour le champ (par exemple 15 sur le champ minute) une liste de valeurs valides, séparées par des virgules (1,3,5 dans le champ mois : janvier, mars, mai) un intervalle valide (1-5 dans le champ jour : du lundi au vendredi) * pour signifier toutes les valeurs possibles du champ (* dans le champ minute : toutes les minutes) */5 (dans le champ minutes : tous les 5 minutes), 0-23/3 (dans le champ heures : toutes les 3 heures) Exemples # exécution chaque 1er et 15 de chaque mois à minuit 0 0 1,15 * * commande # provoquer un reboot la machine chaque 1er et 15 du mois à 2h 30 du matin 30 2 1,15 * * /sbin/shutdown -r # appeler un script de sauvegarde tous les lundis a 3 h 15 du matin 15 3 * * 1 /usr/bin/backup # exécution toutes les heures passées 15 minutes 15 * * * * commande # exécution tous les matins du lundi au vendredi à 7 h 30 30 7 * * 1-5 commande # exécution tous les quarts d'heure de 15h à 19h du lundi au vendredi # seulement en 1ère quinzaine du troisième trimestre 0,15,30,45 15-19 1-15 7-9 1-5 commande # trouver puis nettoyer le répertoire /tmp des vieux fichiers (non modifiés # depuis 31 jours) tous les 1er jour de chaque mois, à 2 heures du matin 0 2 1 * * find /tmp -atime 31 -exec rm -f {} \; at La commande at permet de lancer une commande un jour donné, à une heure donnée. Une fois que cette commande a été exécutée, elle n'existe plus. Pour utiliser la commande at taper at puis l'heure. Ainsi at 12:30 déclenchera la commande à 12 heures 30. La syntaxe des entrées est la suivante : at 12:30 11/30/00 : déclenchera la commande le 30 novembre 2000 (le jour étant indiqué sous la forme mm/jj/aa. at now + 1 hour déclenchera la commande dans 1 heure à partir de maintenant. at 00:00 + 2 days pour exécuter la commande dans 2 jours à minuit. Pr BELKHIR A Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation Jusque là nous n'avons entré aucune commande à exécuter. Lorsque vous tapez la commande at 12:30, vous obtenez l'invite de la commande at at 12:30 $ at 12:30 at>ping -c 1 192.168.0.1 at> ^D $ vous avez alors le message suivant, qui vous indique que votre demande a été prise en compte, avec numéro d'ordre le 1. job 1 at 2000-11-10 12:30 La commande va envoyer un ping sur la machine 192.168.0.1 à 12 heures 30. On peut bien sur faire exécuter un script. Puis at envoie par mail le résultat de cette commande. Si vous souhaitez voir ce qui va se passer taper at -c 1 (1 étant le numéro d'ordre). Si vous ne connaissez plus toutes les commandes en attente tapez at -l (ou atq). Pour supprimer une commande en attente atrm 1 (pour supprimer le job 1). Attention un des grands risques lorsque l'on utilise at est de ne pas vérifier l'heure et le jour de l'exécution de la commande. Contrôle Dans le cas de at ou de crontab, il est possible de définir qui a le droit d'utiliser ces commandes. Pour cela il existe les fichiers /etc/cron.allow /etc/cron.deny et pour at /etc/at.allow et /etc/at.deny. Pour interdire par exemple l'utilisation de la commande at saisissez le nom des utilisateurs dans le fichier at.deny (un par ligne). Remarques Il existe des interfaces graphiques pour créer, modifier, enlever des crontab. mais est-ce bien nécessaire ? Si votre machine n'est pas allumée en permanence, il est alors possible que votre commande crontab ne puisse s'exécuter. Vous pouvez alors utiliser anacron (qui va vérifier les crontab non exécutées et les exécuter dès la remise en route de la machine). 2.4.5 Les autres utilisateurs Nous avons dit qu'Unix était un système multi-utilisateurs, il est intéressant de connaître les possiblités offertes par le système pour échanger de l'information entre les utilisateurs. a) Qui suis-je ? Vous êtes connus du système par votre nom d'utilisateur. Demandez donc lui s'il vous connaît réellement ? $ who am i $ whoami Ces commandes renvoient à l'utilisateur son nom de login. Déterminer la différence entre les deux commandes. b) Les utilisateurs connectés Il est parfois utile de connaître les utilisateurs qui sont connectés en même temps que vous... Pour leur adresser un message de bienvenue par exemple ! Unix vous offre la commande who qui fournit simplement les noms et les terminaux de login, et la commande finger, plus sophistiquée, donnant le nom réel de l'utilisateur. Pr BELKHIR A Dpt Informatique Faculté Electronique et Informatique USTHB 2ème année Licence GTR UASE : Utilisation et Administration des Systèmes d’Exploitation $ who $ finger $ users Remarque : il existe aussi la commande w qui est un mélange du who et du finger. c) Envoyer un message en direct A présent que vous savez quelles sont les personnes connectées sur le système, envoyez leur donc un petit message ! L'envoi d'un message s'effectue par la commande write suivi du nom de l'utilisateur (nom de login) et suivi du caractère [Return]. Ensuite rédigez votre message terminé par les touches [Ctrl] et [d] (^D représente le [Ctrl] [d]). $ write unix Bonjour unix, je suis un ami. ^D $ $ write u1 Bonjour u1 Je suis unix ^D $ A certain moment, vous ne désirez pas être ennuyé par ces messages qui arrivent intempestivement. Utilisez la commande mesg pour autoriser ou interdire la réception de messages. Cette commande exécute un chmod sur le fichier périphérique associé à notre terminal (on peut le vérifier en exécutant un ls -l sur le terminal placé dans le répertoire /dev). $ mesg y Autorise la réception de messages. Votre terminal est accessible. $ mesg n Interdit l'accès de votre terminal aux autres utilisateurs. Les tentatives d'envoi de messages sont vouées à l'échec. "write : permission denied " $ mesg Affiche l'état de votre terminal. Accessible ou non. La commande finger spécifie les utilisateurs se trouvant en mesg n en placant une étoile devant le terminal. Remarque : il existe une commande plus facile d'utilisation : talk. Celle-ci découpe l'écran en deux zones : une zone dans laquelle vous tapez vos messages, une autre où vous recevez les messages de votre correspondant. Il faut pour cela ouvrir une session interactive (les deux utilisateurs tous les deux en talk). 2.5 Le courrier write permet d'envoyer un message à un utilisateur à condition que celui-ci soit connecté. Ceci est gênant lorsque la personne à qui l'on veut écrire est absente. Unix a prévu un système de boîte aux lettres pour remédier à ce petit inconvénient. C'est le mail. Pr BELKHIR A Dpt Informatique 2ème année Licence GTR Faculté Electronique et Informatique UASE : Utilisation et Administration USTHB des Systèmes d’Exploitation mail fonctionne comme le write excepté que la personne n'est prévenue que lors du prochain login par le message : You have mail. Pour envoyer un courrier. $ mail unix Tu es absent, mais je t'envoie un courrier. ^D EOT mail send to unix $ Le texte est envoyé de la même manière que pour write. Sur la fin du message, le système confirme l'envoi du courrier. Pour lire son courrier. Le courrier reçu n'est jamais détruit, c'est à l'utilisateur de nettoyer son courrier selon l'importance des messages. $ mail Permet d'accéder au courrier. Le message No mail s'affiche si l'utilisateur n'a aucun courrier. Dans le cas contraire, il pourra entrer : p pour lire le message courant. s suivi d'un nom de fichier pour enregistrer le message dans le fichier. Si aucun nom n'est spécifié, le fichier par défaut est le fichier mbox. d pour détruire le message lu. + pour passer au message suivant. x pour sortir de la messagerie en abandonnant les modifications. q pour sortir en conservant les modifications. Pr BELKHIR A