web-dev-qa-db-ja.com

プロセスがいつ開始されたか

プロセスがいつ開始されたかを知るために、私の最初の推測は/proc/<pid>/cmdlineは前回作成/変更されました。

psには、STARTフィールドも表示されます。これらのソースはどちらも同じだと思いました。時には彼らは同じではありません。それはどうでしょうか?

32
Swair

少なくともLinuxでは、次のこともできます。

ps -o lstart= -p the-pid

より有用な開始時刻を設定します。

ただし、processが開始された時刻であり、必ずしもcommand現在実行されていることが呼び出されました。プロセスは、存続期間中に複数のコマンドを実行できます(通常、実行します)。そして、コマンドは時々他のプロセスを生み出します。

Linux(少なくとも)の/procにあるファイルのmtimeは、通常、それらのファイルがインスタンス化された日付です。

例えば:

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

/proc/$$/xx*を展開すると、シェルが/proc/$$のコンテンツを読み取ったため、cmdlineファイルがインスタンス化されました。

参照: / proc // fd内のソケットのタイムスタンプ

45

procは仮想ファイルシステムであるため、ファイルステータス情報に依存しません。

プロセスの開始時間は/ proc/PID/stat column 22にあります。システムの起動後、jiffiesで表示されます。これを秒に変換するには、sysconf(_SC_CLK_TCK)で除算する必要があります。これはmostシステムでは100です(すべてではありません!)。

システムの起動時間を取得するには、現在のアップタイムを秒単位で決定します。これは/ proc/uptimeの最初の値です。

これらの2つの数値を使用して、2番目の数値から最初の数値を減算すると、プログラムを開始してから経過した秒数が得られます。

例(for Pidgin):

PID=$(pidof Pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

注:この単純な例は、pidofが複数のPIDを返す場合は機能しません。

11
scai