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!
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)
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!
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