2017-12-08 4 views
2

JVMのProcess ID, CPU and Memoryをn秒ごとにキャプチャして出力をファイルに書き込むシェルスクリプトがあります。私のコードは以下の通りです:複数のプログラムを動的に並行して実行するシェルスクリプト

JVM="aaa001_bcdefx01" 
systime=$(date +"%m-%d-%y-%T") 
for i in {1..10} 
do 
PID=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $2}'` 
MEM=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $4 }'` 
CPU=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $3 }'` 
printf '%-5s %-20s %-20s %-20s %-20s \n' "$systime $JVM $PID $CPU $MEM " >> $LOGFILE 
sleep 5 
done 

これは、そのサーバーに1つのJVMしかない場合、これは完璧に動作します。どのように私は並列に同じスクリプトを実行し、私はサーバーの複数のJVMを持っている場合詳細をフェッチすることができます。

いくつかの解決策を探して、&がスクリプトで使用されていますが、これが上記のスクリプトにどのように実装できるのか理解できませんでした。 5つのJVMがあるとしましょう。どのように私は、スクリプトを実行し、並行して、下のすべてのJVMのための統計を並行してフェッチすることができます。親切にガイドします。どんな助けもありがとう。

JVM="aaa001_bcdefx01" 
JVM="aaa002_bcdefx01" 
JVM="aaa003_bcdefx01" 
JVM="aaa004_bcdefx01" 
JVM="aaa005_bcdefx01" 
+0

上記は冗長に見えます。 '$ systime'とは何ですか?なぜ{1..10}'にいるのですか? – RomanPerekhrest

+0

'systime = $(日付+"%m-%d-%y-%T ")'は時間です。スクリプトで更新されました。私は睡眠時間(間隔)と非常に多くの時間のためのスクリプトを実行する必要があります。 – Dev

+0

私のゴーリー - プロセスは、PID、MEMとCPUを取得する!あなたが本当に必要とするのは2つです... '' PID MEM CPUを読む<'(ps ... | awk '... {print $ 2、$ 4、$ 3}')' –

答えて

0

サブシェルを使用するとどうなりますか?

各JVMシェルスクリプトは、 '('と ')'の中に入る必要があります。最後に '&'を置き、バックグラウンドで実行します。

例を示します。

#!/bin/bash 
echo > testfile.txt 
echo "execute subshell 1" 
(
#JVM 1 should go here 
sleep 10 
echo "subshell 1" >> testfile 
)& 

echo "execute subshell 2" 
(
#JVM 2 should go here 
sleep 10 
echo "subshell 2" >> testfile 
)& 

echo "execute subshell 3" 
(
#JVM 3 should go here 
sleep 10 
echo "subhsell 3" >> testfile 
)& 

各サブシェルは、10秒間待機した後にtestfile.txtにデータを書き込みます。

+0

JVMカウント。どうすればいいのですか? – Dev

+0

まず、すべてのJVM情報 "aaa001_bcdefx01"、 "aaa002_bcdefx01"を見つけ、ファイルに保存します。 ループを使用して各JVMデータを処理し、ループ内でサブシェルを使用する –

+0

同じファイルに並行して追加することで、信念を惹きつけています。あなたが小さな出力を持っている場合、それは大抵正しいことですが、これは保証されません。いつ安全なのか、それが安全でないのかを説明できない場合は、それをやめてください。 –

0

GNU平行な機能は基本的にあなたのコードであるもの

doit() { 
    JVM="$1" 
    systime=$(date +"%m-%d-%y-%T") 
    for i in {1..10} 
    do 
    PID=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $2}'` 
    MEM=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $4 }'` 
    CPU=`ps -auxwww | grep "jdk" | grep $JVM | grep -v grep | cut -c -30 | awk '{print $3 }'` 
    printf '%-5s %-20s %-20s %-20s %-20s \n' "$systime $JVM $PID $CPU $MEM " 
    sleep 5 
    done 
} 
export -f doit 
parallel -j0 --linebuffer --tag doit ::: aaa00{1..5}_bcdefx01 >> $LOGFILE 

のこの種のために作られています。変更は、引数としてJVMをとり、stdout(標準出力)に出力することです。 GNU Parallelは引数aaa00N_bcdefx01(N = 1..5)を使って関数を呼び出し、その出力を$ LOGFILEに保存します。これは、--linebufferを使用して、フルラインがあるとすぐに出力を渡すので、あるプロセスから半分の行を他のプロセスの行と混ざらないことが保証されます。 --tagはJVMに行を追加します。

関連する問題