如何获得长时间运行的Linux进程的启动时间?

是否有可能获得一个旧的运行过程的开始时间? 似乎ps会报告date(不是时间),如果不是今天开始的,只有今年没有开始的那一年。 旧的过程是否永远失去了精确性?

您可以指定一个格式化程序并使用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命令(至less是许多Linux发行版使用的procps版本)有许多与进程开始时间有关的格式字段,包括lstart ,它始终给出进程开始的完整date和时间:

 # 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 shell,然后在那个shell中运行“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 
  ps -eo pid,etime,cmd|sort -n -k2 

作为Adam 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 { 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-($10/ticks))) }' /proc/uptime RS=')' /proc/12345/stat 

在评论中更新了Stephane Chazelas的一些修正; 一如既往的感谢!


1 人过程 ; search开始时间。

  ps -eo pid,cmd,lstart | grep YOUR-PID-HERE