144 votes

Comment déterminer si un processus est en cours d'exécution ou non et l'utiliser pour faire un Shell Shell conditionnel ?

Comment puis-je déterminer si un processus est en cours d'exécution ou non et ensuite faire en sorte qu'un bash script exécute quelque chose en fonction de cette condition ?

Par exemple :

  • si le processus abc est en cours d'exécution, procédez comme suit

  • s'il n'est pas en marche, faites-le.

215voto

John Vrbanac Points 4177

Un bash script pour faire quelque chose comme ça ressemblerait à quelque chose comme ça :

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

Ce script vérifie simplement si le programme "gedit" est en cours d'exécution.

Ou vous pouvez seulement vérifier si le programme ne fonctionne pas comme ceci :

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

40voto

Steve Karg Points 11

Toute solution qui utilise quelque chose comme ps aux | grep abc o pgrep abc sont défectueux.

Pourquoi ?

Parce que vous ne vérifiez pas si un processus spécifique est en cours d'exécution, vous vérifiez s'il y a des processus en cours d'exécution qui se trouvent correspondre à abc . Tout utilisateur peut facilement créer et exécuter un exécutable nommé abc (ou qui contient abc quelque part dans son nom ou ses arguments), provoquant un faux positif pour votre test. Il existe plusieurs options que vous pouvez appliquer à ps , grep y pgrep pour limiter la recherche, mais vous n'obtiendrez toujours pas de test fiable.

Alors comment puis-je tester de manière fiable un certain processus en cours ?

Cela dépend de la raison pour laquelle vous avez besoin du test.

Je veux m'assurer que le service abc est en cours d'exécution, et si non, le démarrer

C'est à ça que sert systemd. Il peut démarrer le service automatiquement et en garder la trace, et il peut réagir quand il meurt.

Voir Comment puis-je vérifier si mon serveur de jeu fonctionne toujours... pour d'autres solutions.

abc est mon script. Je dois m'assurer qu'une seule instance de mon script est en cours d'exécution.

Dans ce cas, utilisez un lockfile ou un lockdir. Par exemple

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

Voir FAQ Bash 45 pour d'autres moyens de verrouillage.

21voto

Zuul Points 1904

C'est ce que j'utilise :

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

En clair : si 'pgrep' renvoie 0, le processus est en cours d'exécution, sinon il ne l'est pas.


Lecture connexe :

Bash Scripting : : Comparaisons de chaînes de caractères

Manuels d'Ubuntu pgrep

6voto

Rommel Cid Points 69

J'ai généralement un pidof -x $(basename $0) sur mon scripts pour vérifier s'il est déjà en cours d'exécution.

4voto

yuvilio Points 3299

En reprenant l'idée de @rommel-cid, vous pouvez utiliser pidof avec le || (||) pour exécuter une commande si le processus n'existe pas et le && pour exécuter quelque chose si le processus existe, créant ainsi une condition rapide if/then/else. Par exemple, en voici une avec un processus en cours d'exécution (mon navigateur chrome, dont le nom de processus est "chrome") et une autre testant un processus qui n'existe pas. J'ai supprimé la sortie standard en utilisant 1>/dev/null pour qu'elle ne s'imprime pas :

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X