web-dev-qa-db-ja.com

長時間実行されているLinuxプロセスの開始時刻を取得する方法

実行中の古いプロセスの開始時刻を取得することは可能ですか? psは、今日が開始されていない場合は日付(時刻ではない)を報告し、今年が開始されていない場合は年のみを報告するようです。古いプロセスでは精度は永久に失われますか?

208
ajwood

次のコマンドのように、フォーマッタを指定して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のページをチェック を読むことができます。

325
wkl

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 $$"コマンドを実行しました。 。)

38
Nathan
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
13
Adam Matan

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を検索してください。

12
tripleee
 ps -eo pid,etime,cmd|sort -n -k2
6
bash-o-logist
    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
4
Stackoverflow