cputimeの出力をpsにフォーマットします。

cputimeの出力をpsにフォーマットします。

私は一定期間プロセスのCPU使用率を監視するためのスクリプトを作成したいと思います(グラフ生成)。

これは私が今まで使っていたコマンドです

ps -p $PROCID -o cputime,etimes

私の唯一の関心事は、CPUTimeの出力が次のように見えることです。[dd]hh:mm(またはこれに似たもの、今は覚えていません)

経過時間を秒単位で取得するために、etime -> etimesなどのCPUtimeを秒単位でフォーマットする方法はありますか?

編集:これは私が現在受け取る出力です。

2-03:01:33 2653793

最初のパラメータを日時:分:秒ではなく秒形式で指定したいと思います。

答え1

これにより、最初の時間が秒に変換されます。

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

たとえば、psコマンドは次のように生成します。

$ ps -p 5403 -o cputime,etimes
    TIME ELAPSED
01:33:38 1128931

このawkコマンドは、以下を処理して返します。

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

説明する

  • -F'[: ]+'

    これは awk にコロンとスペースをフィールド区切り文字として扱うように指示します。これにより、時、分、秒が別々のフィールドとして表示されます。

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

    初期/:/制限コードは、コロンを含む行にのみ適用されます。これによりヘッダー行が削除されます。秒は時、分、秒として計算されますt=$3+60*($2+60*$1)。これにより、結果の値がt経過時間とともに印刷されます。

処理日数

日、時、分、秒が生成されると、ps次のようになります。

2-03:01:33

次に、代わりに次のコードを使用します。

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

日付が出力に追加または追加されない場合は、次のコマンドの組み合わせを使用してください。

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

答え2

ゲームにawkを導入したくない場合は、純粋なbashソリューションを使用できます(t_strにはフォーマット文字列が含まれ、t_secには秒単位のデコード時間が含まれます)。

# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
  t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
  t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi

答え3

どのオペレーティングシステムに適用されるかを指定しませんでした。 Linuxで特定のプロセスを監視することに興味がある場合は、解析する価値が高いと考えることができます/proc/$PROCID/statproc(5)詳しくはマニュアルページをご覧ください。

関連情報