プロセスがいつ開始されたかを知るために最初に推測したのは、/proc/<pid>/cmdline
最後の書き込み/修正時間を確認することです。
ps
フィールドも表示されますSTART
。どちらのソースも同じだと思います。時々彼らは同じではありません。それはどのように可能ですか?
答え1
少なくともLinuxでは、次のようにすることもできます。
ps -o lstart= -p the-pid
より便利な開始時間を得るために。
しかし今はプロセス開始時間は必ずしも時間ではない場合があります。注文する現在呼び出し中です。プロセスは寿命の間に複数のコマンドを実行でき、通常は実行します。コマンドは時々別のプロセスを生成します。
Linuxでは、ファイル変更時間は/proc
通常(少なくとも)そのファイルがインスタンス化された日付です。これは、そのファイルにアクセスするか、ディレクトリの内容を一覧表示する最初の試行日です。
たとえば、
$ 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のソケットのタイムスタンプ
答え2
プロセス仮想ファイルシステムなので、ファイルの状態情報に依存しません。
このプロセスの開始時間は次のとおりです。/proc/PID/統計柱22。システムの起動直後に提供されます。秒に変換するにはsysconf(_SC_CLK_TCK)
100で割る必要があります。最大システム(ただしすべてではありません!)
システムの起動時間を取得するには、最初の値である現在の稼働時間(秒)を確認できます。/proc/稼働時間。
これらの2つの数字を使用して、2番目の数字から最初の数字を減算すると、プログラムを開始してから経過した時間(秒)がわかります。
はい(ピジン):
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が返された場合は機能しません。