列名とプロセス名で値を取得しようとすると、無効な値が表示されます。

列名とプロセス名で値を取得しようとすると、無効な値が表示されます。

信頼性テスト中に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(したがって関連フィールド番号を含む)に達するとループを中断します。次に、最後のフィールドが解析したいコマンドである行のフィールドを印刷します。安全対策として、文字列を含む最初の行のみが考慮されます(プロセス名にも文字列を含めることができる場合)。%CPUiPID

この非常に簡単なアプローチは、引数なしでコマンドを一覧表示した場合にのみ機能します。つまり、スペースで区切られた最後のフィールドは、実際にはコマンドライン引数ではなくコマンドです。

その他の部分については、サイトのガイドラインに従って別途ご質問ください。

おすすめ記事