web-dev-qa-db-ja.com

psのcputimeの出力をフォーマットする

(グラフを作成するために)プロセスのCPU使用率を一定期間監視できるスクリプトを記述しようとしています。

これまでのところ、これは私が使用しているコマンドです

ps -p $PROCID -o cputime,etimes

私の唯一の懸念は、cputimeの出力が[dd]hh:mm(または、似たようなもので、頭のてっぺんを思い出せない)

秒単位でcputimeをフォーマットする方法はありますか?経過時間を秒単位で取得するetime-> etimesのようなものはありますか?

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

2-03:01:33 2653793

最初のパラメーターは、日-時間:分:秒ではなく、秒でフォーマットしたいのですが。

13
dreadiscool

これは最初の時間を秒に変換します:

_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}'
_
9
John1024

ゲームに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
2
Nicolas Breton

このオペレーティングシステムを指定する必要はありません。それがLinuxであり、特定のプロセスの監視に関心がある場合、_/proc/$PROCID/stat_を解析する方が価値があるかもしれません。詳細については、proc(5)のマニュアルページを参照してください。

0
Toby Speight