web-dev-qa-db-ja.com

コマンドラインからプロセスの経過時間を取得する

Linuxでは、/proc/PID/statから、start_time(22:nd)フィールドを取得できます。これは、カーネルが起動してからプロセスが開始されてからの時間を示します。

これをエポック形式の秒に変換する良い方法は何ですか? /proc/statbtimeに追加しますか?

基本的に、私はプロセスのageを探していますが、プロセスが開始された正確な時期ではありません。私の最初のアプローチは、調査中のプロセスのstart_timeと現在のプロセスのstart_timeを比較することです(長時間実行されていないと想定)。

きっともっと良い方法があるはずです。

https://www.kernel.org/doc/Documentation/filesystems/proc.txt を調べたところ、明確な年齢関連のパラメータは見つかりませんでした。

だから、私が現在持っているのは:

process age = (current_utime - ([kernel]btime + [process]start_time))

シェルスクリプト内からより効率的な代替方法はありますか? (理想的には夏時間の変更全体で正しい)

5
MattBianco

バージョン3.3.0以降、Linuxのprocps-ngpsには、プロセスが開始されてからの経過時間を秒単位で示すetimes出力フィールドがあります(ちなみに、プロセスが最後にコマンドを実行してからの経過時間と同じであるとは限りません(もしあれば)(そのプロセスがプロセス名でコマンドを実行していた時間)、思ったほど役に立たない可能性があります) 。

だからあなたはできる:

ps -o etimes= -p "$pid"

Unixエポック時間としての開始時間(GNU date)の場合):

(export TZ=UTC0 LC_ALL=C; date -d "$(ps -o lstart= -p "$pid")" +%s)

/proc/$pidの変更時間は使用できないことに注意してください。 これらのファイルがインスタンス化された時間です これは、プロセスの開始時間とは関係ありません。

8

プロセスの時代:人間が読める形式

_ps -p 1234 -o etime -h
        1-02:03:04
_

プロセスのエポック以来2番目

_stat --format=%Y /proc/1234
_

秒単位の年齢

_expr $(date +%s) - $(stat --format=%Y /proc/1234)
_

追加のリソースps(1)stat(1)

3
Archemar