Ubuntuサーバー(14.04)でプロセスが実行されていることを確認するスクリプトを作成しましたが、うまく機能しましたが、テスト中に他の端末で実行されている親コマンドの数が含まれていないことがわかりました。
コンテンツcheck-process.sh
#!/bin/sh
OK=1
CRITICAL=0
PROCESS_NUM=$( ps -ef | grep $1 | grep -v "grep "|grep -v "sh"|wc -l )
#echo $PROCESS_NUM
if [ $PROCESS_NUM = $OK ]
then
echo "OK"
elif [ $PROCESS_NUM = $CRITICAL ]
then
echo "CRITICAL"
elif [ $PROCESS_NUM > $OK ]
then
echo "MULTIPLE process are runing"
else
echo "error"
fi
top
両方の端末でコマンドを実行し、次のようにこのスクリプトを実行します。
./check-process.sh top
出力は次のようになり0 CRITICAL
ますが、通常のコマンドを実行するとps -ef |grep -v "grep "| wc -l
2つのカウントが提供されます。
ベストアンサー1
質問の説明で指摘したように、テストは>
算術比較ではなく事前比較(2 > 100
たとえば正確さ)を実行しますが、通常の出力リダイレクト演算子がある[[ ... ]]
場合にのみ実行されます。[ ... ]
grep -v "grep "
フィルタリングを使用して、出力grep -v "sh"
から正当なプロセスをフィルタリングすることもできます(たとえば、プロセスでスクリプトを使用しps
たい場合など)。grep
次のスクリプトは同じロジックを実装しますが、次を使用しますpgrep
。
#!/bin/bash
cmd=$1
pids=( $( pgrep "$cmd" ) )
case "${#pids[@]}" in
0) echo 'No such process' ;;
1) echo 'One such process' ;;
*) echo 'Many such processes'
esac
top
このスクリプトを引数として実行すると、他のtop
端末でコマンドを実行すると報告されますOne such process
。top
Many such processes
たとえば、次のように変数を使用します。
#!/bin/bash
cmd=$1
pids=( $( pgrep "$cmd" ) )
critical=0
ok=1
case "${#pids[@]}" in
$critical) echo 'No such process' ;;
$ok) echo 'One such process' ;;
*) echo 'Many such processes'
esac
スクリプトは返されたPIDをpgrep
配列に保存し(これがbash
スクリプトではなくsh
スクリプトである理由)、配列の長さをテストします。
正しい適応は次のとおりですsh
。
#!/bin/sh
cmd=$1
set -- $( pgrep "$cmd" )
critical=0
ok=1
case "$#" in
$critical) echo 'No such process' ;;
$ok) echo 'One such process' ;;
*) echo 'Many such processes'
esac
このsh
スクリプトは、私たちがアクセスできる唯一の配列である位置引数配列を使用します。これらの(位置パラメータ)はでpgrep
生成されたPIDに設定され、これらのパラメータset
の数はから取得されます$#
。