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

问题描述 投票:0回答:8

是否可以获取旧的正在运行的进程的开始时间?看起来,如果今天没有开始,

ps
将报告日期(而不是时间),如果不是今年开始,则仅报告年份。旧工艺的精度会永远丧失吗?

linux bash process
8个回答
586
投票

您可以指定格式化程序并使用

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 的页面以了解其他格式化程序。


51
投票

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 shell,然后不久之后在该 shell 中运行了“ps -p 1 -p $$”命令。 ..)


29
投票

作为 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 { 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 人进程;搜索开始时间


20
投票
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

18
投票
$ ps -p 182454 -o lstart=
Mon Oct 18 17:26:44 2021

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


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

7
投票
 ps -eo pid,etime,cmd|sort -n -k2

-1
投票

使用命令 ls -ld /proc/process_id 其中 process_id 可以使用 top 命令找到

© www.soinside.com 2019 - 2024. All rights reserved.