2

短い間隔で数回呼び出される可能性のあるスクリプト(show_volume.sh)を作成しています。このスクリプトの実行中のインスタンスが複数あるかどうかを判断する方法が必要です。使用できると思っpsたので、この関数をBashで作成しました。

is_only_process(){
    PCOUNT=`ps -a | grep show_volume.sh | wc -l`
    echo $PCOUNT
    if (( PCOUNT==1 )); then
        return 1 
    fi  
    return 0
}

だから私はこれらの2行を追加しました

is_only_process
sleep 4

このスクリプトを一度開始しましたが、の出力はecho $PCOUNT私には意味がありません。予想どおり、常に1ではなく2の値を取得します。このコマンドを実行すると

ps -a | grep show_volume.sh | wc -l

スクリプトの実行中に別の端末から値1を受け取ります。これは、このスクリプトを連続して数回実行した場合、たとえばforループを使用して10回実行した場合とほぼ同じです。別の端末を使用しているときに正しい値を受け取っている間、スクリプト自体が高すぎる値を判別します。

では、なぜこのスクリプトがこれらの奇数値を決定するのでしょうか。

4

4 に答える 4

6

現在ps実行中のプロセスgrep show_volume.shも実行されているため、常にgrepをカウントします。

簡単な解決策、grep s[h]ow_volume.sh。grep(シェルではない)は[h]toを折りたたんでh必要なものを検索しますが、パラメーターに[]が含まれているため、grepはそれ自体と一致しません。

pgrepこのタスクにも役立ち、常に自分自身を除外するのに十分賢いです。

于 2010-12-17T18:28:20.903 に答える
2

スクリプトを別のユーザーとして実行しているps -a場合は、現在のユーザーのインスタンスと、端末が接続されているユーザーのみが表示されます。ps -axまたはを使用しps -eます。

pgrep -c

を使用せずにカウントを表示しますwc

于 2010-12-18T01:46:28.993 に答える
1

show_volume.shgrep自体にも例が含まれているため、grepも除外してみてください。

ps -a | grep show_volume.sh | grep -v grep | wc -l
于 2010-12-17T18:27:55.757 に答える
0

ajrealが提供するソリューション:

ps -a | grep show_volume.sh | grep -v grep | wc -l

動作するはずです。そうでない場合は、の出力を提供してください

ps -a | grep show_volume.sh | grep -v grep

ここ

于 2011-03-08T15:01:16.803 に答える