2011-11-07 2 views
0

特定のタスク(たとえば、Apache Tomcatの数)に対して実行されているプロセスの数を知る必要があります。それ以外の場合は、メッセージを印刷します。実行中のプロセスの名前を列挙し、変数に割り当てます。

result=`ps aux | grep tomcat | awk '{print $2}' | wc -l` 
項目数が生じるように割り当てられている

私はのような何かを実行する際に、今、BASHスクリプトでこれを必要とします。ハレイ!しかし私はPIDを持っていません。しかし、これを中間段階(wcなし)として実行しようとすると、問題が発生します。だから私がこれを行う場合:

result=`ps aux | grep tomcat | awk '{print $2}'` 

私は変数の結果を変更するために何か試みても動作していないようです。私はsetとtr(改行で空白を置き換える)を試みましたが、正しい結果を得ることができません。理想的には、変数結果を個々の要素としてPIDを持つ配列にしたいと思います。それで、サイズや要素を簡単に見ることができます。

誰でも私が間違っていることを示唆することはできますか? おかげで、 フィル

更新:

は、私は、次の構文を使用して終了:

pids=(`ps aux | grep "${searchStr}"| grep -v grep | awk '{print $2}'`) 
number=${#pids[@]} 

キーはバックチェックが入っコマンドの周りに括弧を入れていました。変数pidsは配列であり、長さと要素を求めることができます。

chorobaとDimitreのおかげで彼らの提案と助けに感謝します。

答えて

1
pids=($(
    ps -eo pid,command | 
    sed -n '/[t]omcat/{s/^ *\([0-9]\+\).*/\1/;p}' 
)) 
number=${#pids[@]} 

pids=(...)アレイを作成します。 $(...)は、その出力を文字列として返します(バッククォートに似ています)。 次に、sedがすべてのプロセスのリストで呼び出されます。つまり、tomacatを含む行([t]はsed自体が含まれないようにします)では、pidだけが保持され、出力されます。

+0

こんにちは。最初の行の構文を説明できますか? – Phil

+0

先頭へ(配列定義を開始します。$はコンテンツの出力を ')と同様に文字列として返します。 – choroba

+0

スニペットを貼り付けるだけで答えを説明してください。 – Pubby

1

あなたは(あなたが必要があるかもしれませんか -fオプションを必要としない場合があります)のpgrepコマンドを調整する必要があります。

_pids=( 
    $(pgrep -f tomcat) 
) 

((${#_pids[@]} == 1)) && 
    echo ${_pids[0]} || 
    echo message 

ます(メッセージ付き)のPIDの数を印刷する場合:

_pids=(
    $(pgrep -f tomcat) 
) 

((${#_pids[@]} == 1)) && 
    echo ${_pids[0]} || 
    echo "${#_pids[@]} running" 
のpgrepユーティリティと使用する構文は 標準ないことに注意すべきである

+0

Hmmm。私はあなたの最初の例を試して、それは動作しますが、私はそれを取得しません。構文は何を意味しますか?私もpsとgrepでpgrepを置き換えようとしましたが、それはちょうど間違った結果を返します。 – Phil

+0

もっと明示しようとすれば? 「それはうまくいかない」とはどういう意味ですか?あなたはあなたが得ている行動を説明しようとすることができますか? –

+0

こんにちは。申し訳ありませんが、あなたは私のコメントを誤読しました。私はそれが動作すると言ったが、私は構文を理解していない - 私は($())構文を参照していた。私はこれを調べて、それをさらに理解していると思っていますが、あなたのpgrepを私のps auxに置き換えたときには、 grep $ {searchStr} | grep -v grep | awk '{print $ 2}'私は完全に間違った答えを得ているようです。 – Phil

関連する問題