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.

2voto

Bach Lien Points 129
## bash

## function to check if a process is alive and running:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

## example 1: checking if "gedit" is running

if _isRunning gedit; then
    echo "gedit is running"
else
    echo "gedit is not running"
fi

## example 2: start lxpanel if it is not there

if ! _isRunning lxpanel; then
    lxpanel &
fi

## or

_isRunning lxpanel || (lxpanel &)

Note : pgrep -x lxpanel o pidof lxpanel rapporte toujours que lxpanel est en cours d'exécution même s'il est défunt (zombie) ; ainsi, pour obtenir un processus vivant et en cours d'exécution, nous devons utiliser la commande ps y grep

1voto

ceremcem Points 169

Aucune des solutions "simples" n'a fonctionné pour moi car le binaire que je dois vérifier n'est pas installé sur l'ensemble du système, je dois donc vérifier avec path, ce qui nécessite l'utilisation de ps -ef | grep approche :

app="$_sdir/Logic 1.2.18 (64-bit)/Logic"

app_pid=`ps -ef | grep "$app" | awk '{print $2}'`

if `ps -p $app_pid > /dev/null`; then
    echo "An instance of logic analyzer is appear to be running."
    echo "Not starting another instance."
    exit 5
else
    nohup "$app" &> /dev/null &
fi

0voto

drake01 Points 3311

La première chose qui m'est venue à l'esprit pour votre problème :
ps aux | grep -i abc affichera les détails du processus s'il est en cours d'exécution. Vous pouvez faire correspondre le nombre de lignes ou la durée de son exécution et comparer avec zéro ou toute autre manipulation. Lorsque vous exécutez la commande ci-dessus, elle vous montrera au moins une ligne de sortie, c'est-à-dire le détail du processus créé par la commande grep. Alors faites attention à cela.
Cela devrait faire l'affaire comme un simple hack. Mettez-le dans le bash script et voyez si c'est utile.

0voto

Ringding Points 2400

Utilisation de start-stop-daemon :

/sbin/start-stop-daemon --background --make-pidfile --pidfile /tmp/foo.pid -S --startas /usr/bin/program -- arg1 arg2

Il fonctionne comme un utilisateur normal.

0voto

Wayne Workman Points 17

J'ai constaté que la réponse acceptée postée par @John Vrbanac ne fonctionnait pas pour moi, et que la réponse postée par @geirha ne répond pas à la question originale.

La solution de John Vrbanac n'a pas fonctionné pour vérifier si un processus PHP était en cours d'exécution ou non pour moi, j'utilise CentOS 7.

La réponse de @geirha s'assure seulement qu'une instance n'est pas déjà en cours d'exécution avant d'en démarrer une autre. Ce n'était pas la question originale, la question originale était de vérifier si un processus est en cours d'exécution ou non.

Voici ce qui a marché pour moi :

Disons que mon processus a la chaîne "Jane" dans son nom de processus. Cela permettra de savoir s'il est en cours d'exécution ou non. Cela fonctionne pour BASH et les scripts de PHP.

ps -aux | grep "[J]ane" > /dev/null 2>&1
if [[ "$?" == "0" ]]; then
    echo "It's running"
else
    echo "It's not running"
fi

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