(グラフを作成するために)プロセスのCPU使用率を一定期間監視できるスクリプトを記述しようとしています。
これまでのところ、これは私が使用しているコマンドです
ps -p $PROCID -o cputime,etimes
私の唯一の懸念は、cputimeの出力が[dd]hh:mm
(または、似たようなもので、頭のてっぺんを思い出せない)
秒単位でcputimeをフォーマットする方法はありますか?経過時間を秒単位で取得するetime-> etimesのようなものはありますか?
編集:これは私が現在受け取っている出力です
2-03:01:33 2653793
最初のパラメーターは、日-時間:分:秒ではなく、秒でフォーマットしたいのですが。
これは最初の時間を秒に変換します:
_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}'
_
ゲームに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
このオペレーティングシステムを指定する必要はありません。それがLinuxであり、特定のプロセスの監視に関心がある場合、_/proc/$PROCID/stat
_を解析する方が価値があるかもしれません。詳細については、proc(5)
のマニュアルページを参照してください。