如何获取长时间运行的Linux进程的开始时间?

ajw*_*ood 228 linux bash process

是否有可能获得旧运行过程的开始时间?ps如果今天没有开始,那么它似乎会报告日期(不是时间),如果今年没有开始,则只报告年份.旧工艺的精度是否会永远丢失?

wkl*_*wkl 352

您可以指定格式化程序并使用lstart,如下面的命令:

ps -eo pid,lstart,cmd
Run Code Online (Sandbox Code Playgroud)

上面的命令将输出所有进程,格式化程序用于获取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]                    
      ...
Run Code Online (Sandbox Code Playgroud)

您可以阅读ps的联机帮助页或检查其他格式化程序的Opengroup页面.

  • 为了完整性,对于习惯于BSD语法的人来说:`ps axo pid,cmd,lstart`也有效 (4认同)
  • @ bobbyrne01:改变顺序,例如pid,etime,cmd在Debian Wheezy上为我工作. (3认同)
  • @Gobliins - `etime` 是自进程启动以来经过的时间。 (2认同)
  • @ bobbyme01:使用-ww选项 (2认同)

小智 39

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
Run Code Online (Sandbox Code Playgroud)

有关如何在/ 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
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,我在大约16:50运行了一个"ps -p 1"命令,然后生成了一个新的bash shell,然后不久在该shell中运行了"ps -p 1 -p $$"命令... .)


小智 19

$ ps -p 182454 -o lstart=
Mon Oct 18 17:26:44 2021
Run Code Online (Sandbox Code Playgroud)

但我能在纪元秒内得到答案吗?


Ada*_*tan 13

ls -ltrh /proc | grep YOUR-PID-HERE
Run Code Online (Sandbox Code Playgroud)

例如,我的Google Chrome的PID为11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用 - 它打印修改时间(经常更改)也许是因为这个:http://unix.stackexchange.com/questions/20460/how-do-i-do-a-ls-and-then-排序的,结果按日期创建 (5认同)
  • 为什么是`grep`?为什么不使用ls -ldh / proc / $ pid`?甚至更好,`date -r / proc / $ pid`? (5认同)
  • 这似乎是我唯一可行的选择,尽管可能不可靠。我在一个只有busybox`ps`的嵌入式系统上,它对其他答案提到的所有选项都说“无效选项”。 (2认同)

tri*_*eee 13

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

awk -v RS=')' 'END{print $20}' /proc/12345/stat
Run Code Online (Sandbox Code Playgroud)

从系统启动开始,以时钟周期为单位获取开始时间.1

这是一个使用起来稍微棘手的单位; 另请参阅将jiffies转换为秒以获取详细信息.

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat
Run Code Online (Sandbox Code Playgroud)

这应该给你秒,你可以传递给它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
Run Code Online (Sandbox Code Playgroud)

更新了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 @{}
Run Code Online (Sandbox Code Playgroud)

1 人过程 ; 搜索开始时间.


Sta*_*low 7

    ps -eo pid,cmd,lstart | grep YOUR-PID-HERE
Run Code Online (Sandbox Code Playgroud)


bas*_*ist 6

 ps -eo pid,etime,cmd|sort -n -k2
Run Code Online (Sandbox Code Playgroud)