Cela peut être délicat, car vous pouvez avoir des instances distinctes du même processus qui vivent indépendamment. Par exemple, des serveurs écoutant sur différents ports ou des services fonctionnant sous différents utilisateurs. Afin de faire la distinction entre ces instances, vous devez attribuer à chacune d'entre elles une balise unique. La balise est souvent un fichier, mais elle peut être une socket locale dans l'espace de noms abstrait, un port TCP, etc. - n'importe quel identifiant unique fera l'affaire. Lorsque la balise est un fichier, il peut s'agir d'un fichier standard contenant un ID de processus (un pidfile), ou un canal ou socket nommé que le fichier écoute, etc. Idéalement, la balise est un point de terminaison de communication qui permet aux clients de se connecter à ce processus.
Chacun de ces différents types de balises entraîne une manière différente de vérifier si l'instance que vous recherchez est opérationnelle. Par exemple, avec un socket de fichier local, essayez de vous y connecter et démarrez le processus s'il n'y a pas de processus d'écoute sur ce socket. Si la balise est un fichier pid, vérifiez s'il existe un processus avec cet ID de processus, mais attention à ce qu'il soit fragile, car si le processus est mort, il peut y avoir un processus indépendant qui a réutilisé son ID. Gardez à l'esprit que si deux clients tentent d'atteindre le processus dans un court laps de temps, ils pourraient tous deux constater que le processus n'existe pas et tous les deux tenter de le démarrer; une protection adéquate contre cette condition de concurrence peut être délicate.
Il est plus facile de gérer les instances lorsqu'elles sont toutes démarrées par le même processus de superviseur, et ce processus de superviseur détecte quand les instances meurent et réagit en conséquence. De nombreux programmes de surveillance des services peuvent le faire.
Si le programme ne répond pas sur un point de terminaison de communication connu et qu'il n'est pas géré par un programme superviseur, la balise du pauvre est un fichier pid: un fichier contenant l'ID du processus. Lorsque vous démarrez le processus, écrivez le pid dans un fichier avec un nom préarrangé. Lorsque vous avez besoin que le processus existe, lisez le fichier pid et voyez s'il existe un processus avec ce pid. Lorsque vous tuez le processus, effacez le fichier pid. Le problème le plus important avec un fichier pid non supervisé est que si le processus meurt, son pid peut être réutilisé par un processus non lié. Vous devez au moins vérifier le nom du processus ou l'exécutable du processus pour vous assurer que vous parlez au bon processus. De nombreuses variantes Unix ont une commande pgrep :pgrep SOMENAME
répertorie les processus dont le nom contient SOMENAME en tant que sous-chaîne, avec des options supplémentaires pour limiter à un utilisateur particulier, pour exiger une correspondance exacte, pour changer laquelle des différentes notions possibles de «nom de processus» est utilisée, etc.
ps -ef | grep -v grep | grep "process_name" || run_command_here