GNU/Linux >> Tutoriels Linux >  >> Linux

Comment attendre la sortie des processus non enfants

Sur les BSD et OS X, vous pouvez utiliser kqueue avec EVFILT_PROC+NOTE_EXIT pour faire exactement cela. Aucun sondage requis. Malheureusement, il n'y a pas d'équivalent Linux.


Vous pouvez également créer un socket ou un FIFO et lire dessus. La FIFO est particulièrement simple :Connectez la sortie standard de votre enfant avec la FIFO et lisez. La lecture sera bloquée jusqu'à ce que l'enfant quitte (pour une raison quelconque) ou jusqu'à ce qu'il émette des données. Vous aurez donc besoin d'une petite boucle pour supprimer les données de texte indésirables.

Si vous avez accès à la source de l'enfant, ouvrez le FIFO pour l'écriture lorsqu'il démarre, puis oubliez-le simplement. Le système d'exploitation nettoiera le descripteur de fichier ouvert lorsque l'enfant se terminera et votre processus "parent" en attente se réveillera.

Maintenant, cela pourrait être un processus que vous n'avez pas commencé ou que vous ne possédez pas. Dans ce cas, vous pouvez remplacer l'exécutable binaire par un script qui démarre le vrai binaire mais ajoute également la surveillance comme expliqué ci-dessus.


Jusqu'à présent, j'ai trouvé trois façons de le faire sous Linux :

  • Scrutation :vous vérifiez régulièrement l'existence du processus, soit en utilisant kill soit en testant l'existence de /proc/$pid , comme dans la plupart des autres réponses
  • Utilisez le ptrace appel système pour s'attacher au processus comme un débogueur afin que vous soyez averti lorsqu'il se termine, comme dans la réponse d'a3nm
  • Utilisez le netlink interface pour écouter PROC_EVENT_EXIT messages - de cette façon, le noyau indique à votre programme chaque fois qu'un processus se termine et vous attendez simplement le bon ID de processus. Je n'ai vu cette description qu'à un seul endroit sur Internet.

Prise éhontée :je travaille sur un programme (open source bien sûr ; GPLv2) qui fait l'un des trois.


Rien d'équivalent à wait() . La pratique habituelle consiste à interroger en utilisant kill(pid, 0) et recherche de la valeur de retour -1 et errno de ESRCH pour indiquer que le processus est terminé.

Mise à jour : Depuis le noyau Linux 5.3, il existe un appel système pidfd_open, qui crée un fd pour un pid donné, qui peut être interrogé pour recevoir une notification lorsque le pid est sorti.


Linux
  1. Comment rechercher les codes de sortie pour les applications ?

  2. Comment trouver tous les processus enfants ?

  3. Comment vérifier la taille du tas pour un processus sous Linux

  4. Comment attendre le redémarrage du serveur avec Ansible ?

  5. Comment trouver le fichier .pid pour un processus donné

Comment utiliser la commande htop pour surveiller les processus système en temps réel

Comment tuer les processus Zombie sous Linux

Commandes pour la gestion des processus sous Linux

Comment envoyer des processus en arrière-plan sous Linux

Comment tuer les processus zombies dans Ubuntu

Comment tuer les processus sous Linux en utilisant kill, killall et pkill