実行中の古いプロセスの開始時刻を取得することは可能ですか? ps
は、今日が開始されていない場合は日付(時刻ではない)を報告し、今年が開始されていない場合は年のみを報告するようです。古いプロセスでは精度は永久に失われますか?
次のコマンドのように、フォーマッタを指定してlstart
を使用できます。
ps -eo pid,lstart,cmd
上記のコマンドは、PID、コマンド実行、および開始日時を取得するためのフォーマッタを使用して、すべてのプロセスを出力します。
例(Debian/Jessieコマンドラインから)
$ ps -eo pid,lstart,cmd
PID CMD STARTED
1 Tue Jun 7 01:29:38 2016 /sbin/init
2 Tue Jun 7 01:29:38 2016 [kthreadd]
3 Tue Jun 7 01:29:38 2016 [ksoftirqd/0]
5 Tue Jun 7 01:29:38 2016 [kworker/0:0H]
7 Tue Jun 7 01:29:38 2016 [rcu_sched]
8 Tue Jun 7 01:29:38 2016 [rcu_bh]
9 Tue Jun 7 01:29:38 2016 [migration/0]
10 Tue Jun 7 01:29:38 2016 [kdevtmpfs]
11 Tue Jun 7 01:29:38 2016 [netns]
277 Tue Jun 7 01:29:38 2016 [writeback]
279 Tue Jun 7 01:29:38 2016 [crypto]
...
他のフォーマッタについてはps
のマンページか Opengroupのページをチェック を読むことができます。
Psコマンド(少なくとも多くのLinuxディストリビューションで使用されているprocpsバージョン)には、常にプロセスの開始日時を示すlstart
など、プロセスの開始時間に関連するいくつかのフォーマットフィールドがあります。
# ps -p 1 -wo pid,lstart,cmd
PID STARTED CMD
1 Mon Dec 23 00:31:43 2013 /sbin/init
# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER PID %CPU %MEM VSZ RSS TT STAT STARTED CMD
root 1 0.0 0.1 2800 1152 ? Ss Mon Dec 23 00:31:44 2013 /sbin/init
root 5151 0.3 0.1 4732 1980 pts/2 S Sat Mar 8 16:50:47 2014 bash
情報が/ procファイルシステムにどのように公開されるかについては、 https://unix.stackexchange.com/questions/7870/how-to-check-how-long-a-process-has-)を参照してください。実行中
(Linuxでの私の経験では、/ proc /ディレクトリのタイムスタンプは、プロセスの開始時間ではなく、仮想ディレクトリが最近アクセスされた瞬間に関連しているようです。
# date; ls -ld /proc/1 /proc/$$
Sat Mar 8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151
この場合、16時50分ごろに "ps -p 1"コマンドを実行し、次に新しいbashシェルを起動して、その直後にそのシェル内で "ps -p 1 -p $$"コマンドを実行しました。 。)
ls -ltrh /proc | grep YOUR-PID-HERE
たとえば、私のGoogle ChromeのPIDは11583です。
ls -l /proc | grep 11583
dr-xr-xr-x 7 adam adam 0 2011-04-20 16:34 11583
Adam Matan's answer のフォローアップとして、/proc/<pid>
ディレクトリのタイムスタンプ自体は必ずしも直接的には有用ではありませんが、次のようにすることができます。
awk -v RS=')' 'END{print $20}' /proc/12345/stat
システム起動後の開始時刻をクロック数で取得します。1
これはややトリッキーなユニットです。詳しくは jiffiesをsecondsに変換する もご覧ください。
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { print now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat
これはあなたに秒を与えるべきで、あなたは(人間が読めるか、そうでなければ)タイムスタンプを取得するためにstrftime()
に渡すことができます。
awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat
コメントのStephane Chazelasからのいくつかの修正で更新しました。いつもありがとう!
あなたがMawkしか持っていないのなら、たぶん試してみてください
awk -v ticks="$(getconf CLK_TCK)" -v Epoch="$(date +%s)" '
NR==1 { now=$1; next }
END { printf "%9.0f", Epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}
1 man proc ; starttimeを検索してください。
ps -eo pid,etime,cmd|sort -n -k2
ps -eo pid,cmd,lstart | grep YOUR-PID-HERE