信頼性テスト中にCPUとメモリ使用率を監視するスクリプトを作成していますが、最終的にはそれをチャートやその他のビジュアライゼーションツールとして表示したいと思います。そのために、列名で親コマンドから%CPUと%MEMを抽出しようとしました。
##to get indexes of columns I need
indexCPU=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln | grep "%CPU" | cut -f1)
infexMEM=$(top -b -n 1 | grep PID | tr -s ' ' '\n' | nl -nln | grep "%MEM" | cut -f1)
## get values from top in a while loop
while [ $UPTIME -lt $DURRATION ]; do
scpu=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU )
smem=$(top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $infexMEM )
echo "$scpu $smem" >> stabilityTestUsageM.txt
sleep 300
done
これを行うと、時には正しい値が得られますが、他の場合は左側の値が得られます。
たとえば、出力を取得しました。
S
そのために:
top -b -n 1| grep -w squeezer | tr -s ' ' | cut -d ' ' -f $indexCPU
これはtop -b -n 1 | grep -w 押出機の結果です。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8048 root 20 0 1953716 442376 8460 S 0.0 2.7 0:30.97 squeezer
何が問題なのかご存知ですか?
ありがとう
ベストアンサー1
top
アプローチの問題は、フィールドnrを識別する最初のステップで、カウントから「nullフィールド」(出力で先行スペースで生成される)を省略することです。ただし、cut
区切り文字を単一のスペースに設定すると、スペースで始まる行の先頭に空のフィールドがあると解釈されます。したがって、あなたが決定したフィールド番号は、フィールドのnl -nln
計算方法に比べて1が少なくなります。cut
ただし、通常は次のことをお勧めしますawk
。
top -b -n 1 | awk '$NF=="squeezer" {print $9}'
最後のスペースで区切られたフィールド(コマンド)が「squeezer」である行の9番目のフィールド(CPU使用量)を印刷する必要があります。
簡単に判断できるように、CPU フィールドを名前で識別するには、次の方法を使用できます。
top -b -n 1 | awk '!i&&/PID/{for (i=1;i<=NF;i++) {if ($i=="%CPU") break}} '$NF=="squeezer" {print $i}}'
これは、最初に列ヘッダーを含む行のすべてのフィールドを繰り返し、読み取りフィールドPID
(したがって関連フィールド番号を含む)に達するとループを中断します。次に、最後のフィールドが解析したいコマンドである行のフィールドを印刷します。安全対策として、文字列を含む最初の行のみが考慮されます(プロセス名にも文字列を含めることができる場合)。%CPU
i
PID
この非常に簡単なアプローチは、引数なしでコマンドを一覧表示した場合にのみ機能します。つまり、スペースで区切られた最後のフィールドは、実際にはコマンドライン引数ではなくコマンドです。
その他の部分については、サイトのガイドラインに従って別途ご質問ください。