プロセスが開始されたのはいつですか


31

プロセスがいつ開始されたかを知るために、私の最初の推測は/proc/<pid>/cmdline、最後に書き込まれた/変更された時間をチェックすることでした。

psSTARTフィールドも表示します。これらのソースは両方とも同じだと思いました。時々それらは同じではありません。どうでしたか?


回答:


44

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

ps -o lstart= -p the-pid

より便利な開始時間を持つため。

ただし、プロセスが開始された時刻であり、必ずしも現在実行中のコマンドが呼び出された時刻ではないことに注意してください。プロセスは、その存続期間中に複数のコマンドを実行できます(そして一般的に実行します)。また、コマンドは他のプロセスを生成する場合があります。

/proc(少なくとも)Linux上のファイルのmtimes は一般に、それらのファイルがインスタンス化された日付です。これは、何かがそれらにアクセスしようとしたか、ディレクトリの内容をリストしようとした初めてです。

例えば:

$ 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のソケットのタイムスタンプ


11

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

プロセスの開始時刻は/ proc / PID / stat22にあります。システムのブート後にjiffiesで与えられます。秒に変換するにsysconf(_SC_CLK_TCK)は、ほとんどのシステムで100で割る必要があります(すべてではありません!)。

システムの起動時間を取得するには、/ proc / uptimeの最初の値である現在の稼働時間を秒単位で決定します

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

例(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を返す場合、この単純な例は機能しません。


proc / <pid> / cmdlineがいつ書き込まれるかについてのアイデアはありますか?proc / <pid>エントリのいずれかが問題になります。
Swair

2
通常、これらのファイルは、読み取ろうとするたびにカーネルによって動的に生成され、ほとんどのファイルには動的コンテンツも含まれています。cmdlineはそうではありませんが、プロセスの起動時に一度作成する必要があり、二度と触れてはならないという公式のポリシーがあるとは想像できません。
scai

あなたは「getconf CLK_TCK」を実行することで、コマンドラインから_SC_CLK_TCK値を得ることができます
oᴉɹǝɥɔ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.