web-dev-qa-db-fra.com

Vérifiez si le programme est en cours d'exécution avec le script shell bash?

Voici un exemple de script bash qui vérifie le fonctionnement d'un processus (démon ou service) et effectue des actions spécifiques (rechargement, envoi de courrier) si aucun processus de ce type n'est en cours d'exécution.

check_process(){
        # check the args
        if [ "$1" = "" ];
        then
                return 0
        fi

        #PROCESS_NUM => get the process number regarding the given thread name
        PROCESS_NUM='ps -ef | grep "$1" | grep -v "grep" | wc -l'
        # for degbuging...
        $PROCESS_NUM
        if [ $PROCESS_NUM -eq 1 ];
        then
                return 1
        else
                return 0
        fi
}

# Check whether the instance of thread exists:
while [ 1 ] ; do
        echo 'begin checking...'
        check_process "python test_demo.py" # the thread name
        CHECK_RET = $?
        if [ $CHECK_RET -eq 0 ]; # none exist
        then
                # do something...
        fi
        sleep 60
done

Cependant, ça ne marche pas. J'ai eu "ERROR: option de déchets." pour la commande ps. Quel est le problème avec ces scripts? Merci!

18
Charlie Epps

Si vous voulez exécuter cette commande, vous devriez probablement changer:

PROCESS_NUM='ps -ef | grep "$1" | grep -v "grep" | wc -l'

à:

PROCESS_NUM=$(ps -ef | grep "$1" | grep -v "grep" | wc -l)
24
paxdiablo

Vous pouvez réaliser presque tout dans PROCESS_NUM avec ce one-liner:

[ `pgrep $1` ] && return 1 || return 0

si vous recherchez un correspondance partielle , le programme s'appelle foobar et vous voulez que votre $1 soit juste foo vous pouvez ajouter le -f switch à pgrep:

[[ `pgrep -f $1` ]] && return 1 || return 0

En réunissant tout votre script pourrait être retravaillé comme ceci:

#!/bin/bash

check_process() {
  echo "$ts: checking $1"
  [ "$1" = "" ]  && return 0
  [ `pgrep -n $1` ] && return 1 || return 0
}

while [ 1 ]; do 
  # timestamp
  ts=`date +%T`

  echo "$ts: begin checking..."
  check_process "dropbox"
  [ $? -eq 0 ] && echo "$ts: not running, restarting..." && `dropbox start -i > /dev/null`
  sleep 5
done

Courir cela ressemblerait à ceci:

# Shell #1
22:07:26: begin checking...
22:07:26: checking dropbox
22:07:31: begin checking...
22:07:31: checking dropbox

# Shell #2
$ dropbox stop
Dropbox daemon stopped.

# Shell #1
22:07:36: begin checking...
22:07:36: checking dropbox
22:07:36: not running, restarting...
22:07:42: begin checking...
22:07:42: checking dropbox

J'espère que cela t'aides!

36
slm
PROCESS="process name shown in ps -ef"
START_OR_STOP=1        # 0 = start | 1 = stop

MAX=30
COUNT=0

until [ $COUNT -gt $MAX ] ; do
        echo -ne "."
        PROCESS_NUM=$(ps -ef | grep "$PROCESS" | grep -v `basename $0` | grep -v "grep" | wc -l)
        if [ $PROCESS_NUM -gt 0 ]; then
            #runs
            RET=1
        else
            #stopped
            RET=0
        fi

        if [ $RET -eq $START_OR_STOP ]; then
            sleep 5 #wait...
        else
            if [ $START_OR_STOP -eq 1 ]; then
                    echo -ne " stopped"
            else
                    echo -ne " started"
            fi
            echo
            exit 0
        fi
        let COUNT=COUNT+1
done

if [ $START_OR_STOP -eq 1 ]; then
    echo -ne " !!$PROCESS failed to stop!! "
else
    echo -ne " !!$PROCESS failed to start!! "
fi
echo
exit 1
0
holysmoke