shスクリプトはトップレベルのコマンドを計算しません

shスクリプトはトップレベルのコマンドを計算しません

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 -l2つのカウントが提供されます。

ベストアンサー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 processtopMany 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の数はから取得されます$#

おすすめ記事