これは、実行中のプロセス(デーモンまたはサービス)をチェックし、実行中のプロセスがない場合に特定のアクション(リロード、メール送信)を行うbashスクリプトの例です。
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
ただし、機能しません。 「エラー:ガベージオプション」が表示されました。 ps
コマンド用。これらのスクリプトの何が問題になっていますか?ありがとう!
executeそのコマンドを使用する場合は、おそらく変更する必要があります。
PROCESS_NUM='ps -ef | grep "$1" | grep -v "grep" | wc -l'
に:
PROCESS_NUM=$(ps -ef | grep "$1" | grep -v "grep" | wc -l)
このワンライナーでPROCESS_NUM
のほぼすべてを実現できます。
[ `pgrep $1` ] && return 1 || return 0
部分一致を探している場合、つまりプログラムの名前がfoobarであり、$1
をfooにしたい場合-f switch
をpgrepに追加できます:
[[ `pgrep -f $1` ]] && return 1 || return 0
スクリプトをすべてまとめると、次のように作り直すことができます。
#!/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
実行すると次のようになります。
# 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
お役に立てれば!
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