長時間実行されるLinuxプロセスの開始時間を取得する方法は?[閉まっている]


250

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


16
使用に問題はありps -p <pid> -o lstartますか?うまくいくようですが、この質問が何度も出てくるように思われるのに、なぜそれがすぐに明白な答えにならないのかはわかりません。
ajwood 2011

7
@ajwood ps -p <pid> -o lstart=追加の行(ヘッダー)が印刷されないようにするために使用する方が良いでしょう。
ウラジミールプロタソフ2014年

2
使用に問題はありps -p <pid> -o lstartますか?たぶん、実際にはありませんlstartで、どちらも2004年版もで2013年版 POSIX 1003.1の標準?
Piotr Dobrogost 2014年

5
@PiotrDobrogost、質問がPOSIXについて尋ねられた場合、それは問題になりますが、Linuxについて尋ねています。
ウォンブル、2014

4
Mods-techraf、Makyen、David Rawson、Tsyvarev、Paul Roub-質問を閉じる代わりに、StackExchangeやSuperuserなどのより適切なサイトに移動してみませんか?これは良いと便利な質問です
Hanxue

回答:


392

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のページ確認してください


3
@ bobbyrne01:順序を変更します。たとえば、pid、etime、cmdがDebian Wheezyで動作します。
exic 2014年

1
@Gobliins- etimeプロセスが開始されてからの経過時間です。
wkl 2016

4
完全を期すため、BSD構文に慣れている方のために:ps axo pid,cmd,lstart動作します
Graeme Moss

2
@ bobbyme01:-wwオプションを使用
Ed Randall

1
lstart時間は変わる可能性があることに注意してください。stat以下の方法がより安全です-unix.stackexchange.com/questions/274610/…
slm

43

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-been-runningを参照して ください。

(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 $$」コマンドを実行したことに注意してください... 。)


すべてのプロセス(自分のプロセスだけでなく)を表示するには、psコマンドにe(標準ps構文)またはax(BSD構文)引数を追加します:ie ps -ewo pid,lstart,cmdまたはps -axwo pid,lstart,cmd
Ryan Griffith

15

フォローアップとして、アダムMatanの答え/proc/<pid>のようなディレクトリのタイムスタンプは、必ずしも直接的に有用ではありませんが、あなたは使用することができます

awk -v RS=')' 'END{print $20}' /proc/12345/stat

システムブート以降の開始時間をクロック刻みで取得します。1

これは少しトリッキーなユニットです。詳細については、jiffiesを秒に変換するもご覧ください。

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", 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\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 人proc ; starttimeを検索します。


本番用に少しリファクタリング:gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee

1
strftime()systime()はに存在しないことを覚えておいてくださいmawk。これは、awk私のDebian 8 VPSイメージのデフォルトなので、それらがgawkの方言に固有であるとしか想定できません。
ssokolow 2017

13
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

6
: -これが私のために動作しません、それはたぶん、このための修正時刻(頻繁に変更される)印刷しunix.stackexchange.com/questions/20460/...
user920391

/ proc / <pid>のタイムスタンプは信頼できません。
ヘニング

1
これは、私が情報を持っているプロセスが実際に開始したときより9分遅れて時間を返しました。
Dan Dascalescu 2017年

1
これは動作する私の唯一のオプションのようですが、おそらく信頼できません。私はbusyboxの持つ組み込みシステム上だpsと言うinvalid option他の回答で述べたすべてのオプションを。
Qi Fan

7
なんでgrep?なんでls -ldh /proc/$pid?またはさらに良いdate -r /proc/$pidですか?
シーザー、


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.