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


12

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

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

ps -p $PROCID -o cputime,etimes

私の唯一の懸念は、cputimeの出力が[dd]hh:mm(または似たようなもので、今では頭の外では思い出せない)に見えることです。

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

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

2-03:01:33 2653793

最初のパラメーターは、日-時間:分:秒ではなく、秒単位でフォーマットする必要があります。


現在受け取っている出力と受け取りたい出力を追加してください。
Simply_Me 14

@Simply_Me私はポストを編集した
dreadiscool

@ John1024はい、そうです、それは日数です。
dreadiscool 14

回答:


9

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

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}'

私は間違ってんだけど、このコマンドは、先頭に追加することができ、アカウントの日に取っているようにそれが見えない場合は、私を許して
dreadiscool

それは正しい:私のシステムはどのプロセスでも日を表示しませんでした。どのような日になるか推測できますが、実際の例を提供できますか?
ジョン1024 14

2-03:01:33は2日、3時間、1分、33秒です。ただし、日が常に追加されるわけではありません。私のシステムでは、プロセスが24時間以上動作している場合にのみ先頭に追加されます。あなたの助けのおかげで、これまでところで、私はそれを感謝
dreadiscool

@ user1772510日を処理するために回答が更新されました。
John1024 14

すべてのご協力に感謝します。もし私が賛成票を投じることができたら、私も賛成票を投じます(このコミュニティでは十分な担当者ではありません)。
dreadiscool 14

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

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.