プロセスがいつ開始されたかを知るために、私の最初の推測は/proc/<pid>/cmdline
は前回作成/変更されました。
ps
には、START
フィールドも表示されます。これらのソースはどちらも同じだと思いました。時には彼らは同じではありません。それはどうでしょうか?
少なくとも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は仮想ファイルシステムであるため、ファイルステータス情報に依存しません。
プロセスの開始時間は/ 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を返す場合は機能しません。