コマンドラインからプロセス期間を取得する

コマンドラインからプロセス期間を取得する

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

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

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

もちろん、より良い方法が必要です。

調査時に明らかな年齢関連パラメータが見つかりませんでした。https://www.kernel.org/doc/Documentation/filesystems/proc.txt

だから私が現在持っているのは次のとおりです。

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

シェルスクリプトにもっと効率的な選択肢がありますか? (夏時間が変わると理想的に正しい)

答え1

バージョン3.3.0以降、psLinuxには、プロセスが開始されてから経過した秒数を提供する出力フィールドがprocps-ngありますetimes。しかし、これがプロセスが最後にコマンドを実行してからの時間と必ずしも関連付けられているわけではありません(ifが存在する場合!)(プロセスがプロセス名からコマンドを実行した時間)であるため、思ったほど役に立たない可能性があります。

だからあなたはこれを行うことができます:

ps -o etimes= -p "$pid"

Unix エポック時間開始時間の場合 (GNU を使用date):

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

修正時間は使用できません/proc/$pidこれはまさにこれらのファイルがインスタンス化される時点です。これはプロセスの開始時間とは何の関係もありません。

答え2

プロセス期間:人が読める形式

ps -p 1234 -o etime -h
        1-02:03:04

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

stat --format=%Y /proc/1234

年齢で2番目

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

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

関連情報