如何获得一个长时间运行的Linux进程的开始时间?

是否有可能获得一个旧的正在运行的进程的开始时间?似乎ps将报告日期(而不是时间)如果它不是今天开始,如果它不是今年开始,只报告年份。老工艺的精确度会永远消失吗?

281213 次浏览

你可以指定一个格式化程序并使用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的manpage或其他格式化程序的查看Opengroup的页面

ls -ltrh /proc | grep YOUR-PID-HERE

例如,我的谷歌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

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 < / p >

(根据我在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 $$”命令,随后不久....)

作为亚当·马坦的回答的后续,/proc/<pid>目录的时间戳本身不一定直接有用,但你可以使用

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

获取自系统引导. __abc0以来的时钟滴答的开始时间

这是一个使用起来有点棘手的单位;详情请参见将jiffy转换为秒

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的一些修复;一如既往的感谢!

如果你只有莫克,也许可以试试

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;搜索开始时间

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

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

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

但是我能得到以epoch秒为单位的答案吗?