如何获得长时间运行的Linux进程的开始时间?[关闭]


250

是否可以获取旧的运行过程的开始时间?ps如果今天不是开始日期,似乎将报告日期(而不是时间),如果今年不是开始日期,则仅报告年份。旧工艺会永远失去精度吗?


16
使用有什么问题ps -p <pid> -o lstart吗?似乎可行,但是我不确定为什么在很多时候这个问题似乎不是立即显而易见的答案。
2011年

7
@ajwood最好ps -p <pid> -o lstart=避免使用其他行(标题)进行打印。
弗拉基米尔·普罗塔索夫(Fladimir Protasov)2014年

2
使用有什么问题ps -p <pid> -o lstart吗?也许事实有没有lstart既不是2004年版,也不在2013版 POSIX的1003.1标准?
Piotr Dobrogost 2014年

5
@PiotrDobrogost,如果该问题询问有关POSIX的问题,那将是一个问题,但它询问的是Linux。
womble 2014年

4
Mods-techraf,Makyen,David Rawson,Tsyvarev,Paul Roub-为什么不将其移至更合适的站点(如StackExchange或Superuser),而不是关闭问题?这是一个很好且有用的问题
Hanxue

Answers:


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

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文件系统中发布信息的讨论,请参见 /unix/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 shell,然后不久后在该shell中运行了“ ps -p 1 -p $$”命令... )


要查看每个进程(不仅仅是您自己的进程),请在ps命令中添加一个e(标准ps语法)或ax(BSD语法)参数:ie ps -ewo pid,lstart,cmdps -axwo pid,lstart,cmd
Ryan Griffith

15

作为Adam Matan回答的后续措施,/proc/<pid>目录的时间戳本身不一定直接有用,但是您可以使用

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

获取自系统启动以来的时钟滴答声的开始时间。1个

这是一个使用起来有点棘手的单元;有关详细信息,另请参见将抖动转换为秒

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 个人过程 ; 搜索开始时间



1
请记住,strftime()systime()中不存在和mawk,这是awk我的Debian 8 VPS图像中的默认设置,因此我只能假定它们特定于gawk的方言。
ssokolow

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>的时间戳不可靠。
Henning

1
返回的时间比我知道的进程实际开始时晚了9分钟。
Dan Dascalescu

1
这似乎是我唯一可行的选择,尽管可能不可靠。我在一个只有busybox的嵌入式系统上,ps其中说出invalid option了其他答案提到的所有选项。
齐帆

7
为什么grep呢 为什么不ls -ldh /proc/$pid呢?甚至更好date -r /proc/$pid
凯撒


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.