Unix / Linux - Gestion des processus

Dans ce chapitre, nous discuterons en détail de la gestion des processus sous Unix. Lorsque vous exécutez un programme sur votre système Unix, le système crée un environnement spécial pour ce programme. Cet environnement contient tout ce dont le système a besoin pour exécuter le programme comme si aucun autre programme n'était en cours d'exécution sur le système.

Chaque fois que vous émettez une commande sous Unix, elle crée ou démarre un nouveau processus. Lorsque vous avez essayé lelspour lister le contenu du répertoire, vous avez démarré un processus. Un processus, en termes simples, est une instance d'un programme en cours d'exécution.

Le système d'exploitation suit les processus via un numéro d'identification à cinq chiffres appelé pid ou la process ID. Chaque processus du système a unpid.

Les pid finissent par se répéter car tous les nombres possibles sont épuisés et le pid suivant roule ou recommence. À tout moment, il n'y a pas deux processus avec le même pid dans le système car c'est le pid qu'Unix utilise pour suivre chaque processus.

Démarrage d'un processus

Lorsque vous démarrez un processus (exécutez une commande), vous pouvez l'exécuter de deux manières:

  • Processus de premier plan
  • Processus en arrière-plan

Processus de premier plan

Par défaut, chaque processus que vous démarrez s'exécute au premier plan. Il obtient son entrée du clavier et envoie sa sortie à l'écran.

Vous pouvez voir que cela se produit avec le lscommander. Si vous souhaitez lister tous les fichiers de votre répertoire actuel, vous pouvez utiliser la commande suivante -

$ls ch*.doc

Cela afficherait tous les fichiers, dont les noms commencent par ch et terminer par .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Le processus s'exécute au premier plan, la sortie est dirigée vers mon écran et si le ls La commande veut une entrée (ce qu'elle ne fait pas), elle l'attend depuis le clavier.

Lorsqu'un programme s'exécute au premier plan et prend du temps, aucune autre commande ne peut être exécutée (démarrez d'autres processus) car l'invite ne serait pas disponible tant que le programme n'a pas terminé le traitement et n'est pas sorti.

Processus en arrière-plan

Un processus d'arrière-plan s'exécute sans être connecté à votre clavier. Si le processus d'arrière-plan nécessite une entrée au clavier, il attend.

L'avantage d'exécuter un processus en arrière-plan est que vous pouvez exécuter d'autres commandes; vous n'avez pas à attendre qu'il se termine pour en démarrer un autre!

Le moyen le plus simple de démarrer un processus en arrière-plan consiste à ajouter une esperluette (&) à la fin de la commande.

$ls ch*.doc &

Ceci affiche tous les fichiers dont les noms commencent par ch et terminer par .doc -

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Ici, si le ls La commande veut une entrée (ce qu'elle ne fait pas), elle passe dans un état d'arrêt jusqu'à ce que nous la déplacions au premier plan et lui donnions les données du clavier.

Cette première ligne contient des informations sur le processus d'arrière-plan - le numéro de travail et l'ID de processus. Vous devez connaître le numéro de travail pour le manipuler entre l'arrière-plan et le premier plan.

Appuyez sur la touche Entrée et vous verrez ce qui suit -

[1]   +   Done                 ls ch*.doc &
$

La première ligne vous indique que le lsle processus d'arrière-plan de la commande se termine avec succès. Le second est une invite pour une autre commande.

Liste des processus en cours d'exécution

Il est facile de voir vos propres processus en exécutant le ps (état du processus) comme suit -

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

L'un des indicateurs les plus couramment utilisés pour ps est le -f (f pour full), qui fournit plus d'informations comme indiqué dans l'exemple suivant -

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

Voici la description de tous les champs affichés par ps -f commande -

N ° Sr. Colonne et description
1

UID

ID utilisateur auquel appartient ce processus (la personne qui l'exécute)

2

PID

ID de processus

3

PPID

ID de processus parent (l'ID du processus qui l'a démarré)

4

C

Utilisation du processeur du processus

5

STIME

Heure de début du processus

6

TTY

Type de terminal associé au processus

sept

TIME

Temps CPU pris par le processus

8

CMD

La commande qui a lancé ce processus

Il existe d'autres options qui peuvent être utilisées avec ps commande -

N ° Sr. Option et description
1

-a

Affiche des informations sur tous les utilisateurs

2

-x

Affiche des informations sur les processus sans terminaux

3

-u

Affiche des informations supplémentaires comme l'option -f

4

-e

Affiche des informations étendues

Arrêt des processus

La fin d'un processus peut se faire de plusieurs manières différentes. Souvent, à partir d'une commande basée sur la console, l'envoi d'une touche CTRL + C (le caractère d'interruption par défaut) quittera la commande. Cela fonctionne lorsque le processus s'exécute en mode de premier plan.

Si un processus s'exécute en arrière-plan, vous devez obtenir son ID de tâche à l'aide du pscommander. Après cela, vous pouvez utiliser lekill commande pour tuer le processus comme suit -

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Ici le kill la commande met fin au first_oneprocessus. Si un processus ignore une commande kill standard, vous pouvez utiliserkill -9 suivi de l'ID de processus comme suit -

$kill -9 6738
Terminated

Processus parents et enfants

Chaque processus unix a deux numéros d'identification qui lui sont attribués: l'ID de processus (pid) et l'ID de processus parent (ppid). Chaque processus utilisateur du système a un processus parent.

La plupart des commandes que vous exécutez ont le shell comme parent. Vérifier laps -f exemple où cette commande a répertorié à la fois l'ID de processus et l'ID de processus parent.

Processus zombies et orphelins

Normalement, lorsqu'un processus enfant est tué, le processus parent est mis à jour via un SIGCHLDsignal. Ensuite, le parent peut effectuer une autre tâche ou redémarrer un nouvel enfant si nécessaire. Cependant, parfois, le processus parent est tué avant que son enfant ne soit tué. Dans ce cas, le "parent de tous les processus", leinitprocessus, devient le nouveau PPID (ID de processus parent). Dans certains cas, ces processus sont appelés processus orphelins.

Lorsqu'un processus est tué, un ps la liste peut toujours afficher le processus avec un ZEtat. Il s'agit d'un processus zombie ou obsolète. Le processus est mort et n'est pas utilisé. Ces processus sont différents des processus orphelins. Ils ont terminé l'exécution mais trouvent toujours une entrée dans la table de processus.

Processus démon

Les démons sont des processus d'arrière-plan liés au système qui s'exécutent souvent avec les autorisations de requêtes racine et de services provenant d'autres processus.

Un démon n'a pas de terminal de contrôle. Il ne peut pas ouvrir/dev/tty. Si vous faites un"ps -ef" et regardez le tty champ, tous les démons auront un ? pour le tty.

Pour être précis, un démon est un processus qui s'exécute en arrière-plan, attendant généralement qu'il se passe quelque chose avec lequel il est capable de travailler. Par exemple, un démon d'imprimante en attente de commandes d'impression.

Si vous avez un programme qui nécessite un long traitement, alors cela vaut la peine d'en faire un démon et de l'exécuter en arrière-plan.

Le commandement supérieur

le top La commande est un outil très utile pour afficher rapidement des processus triés selon différents critères.

Il s'agit d'un outil de diagnostic interactif qui se met à jour fréquemment et affiche des informations sur la mémoire physique et virtuelle, l'utilisation du processeur, les moyennes de charge et vos processus occupés.

Voici la syntaxe simple pour exécuter la commande top et pour voir les statistiques d'utilisation du processeur par différents processus -

$top

ID de tâche et ID de processus

Les processus en arrière-plan et suspendus sont généralement manipulés via job number (job ID). Ce numéro est différent de l'ID de processus et est utilisé car il est plus court.

De plus, un travail peut être constitué de plusieurs processus s'exécutant en série ou en même temps, en parallèle. L'utilisation de l'ID de tâche est plus facile que le suivi des processus individuels.