如何找到Linux进程的正常运行时间


69

如何找到给定Linux进程的正常运行时间。

ps aux | grep gedit | grep -v grep

给了我很多信息,包括启动过程的时间。我专门在寻找能以毫秒为单位返回进程正常运行时间的开关。

谢谢

Answers:


113

由于“正常运行时间”具有多种含义,因此这是一个有用的命令。

ps -eo pid,comm,lstart,etime,time,args

该命令列出了所有与时间相关的不同列的所有进程。它包含以下列:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND

PID=
第一个进程ID COMMAND=仅命令名称,不带选项,不带参数
STARTED=进程启动的绝对时间=进程启动
ELAPSED以来经过的时间(挂钟时间),格式[[dd-] hh:] mm:ss TIME=累积CPU时间,“ [dd-] hh:mm:ss”格式,
COMMAND=再次是命令,这次是它提供的所有选项和参数


1
真好 我更喜欢etimes自己-经过的时间(以秒为单位)-因此可以机读
Asfand Qazi

1
问题是关于统计时间(以毫秒为单位)
yohann.martineau

不幸的是,busybox 1.29.3破坏了etime的格式,因此请不要依赖它进行解析。
丹尼·杜莱

10

如果您有的限定版本,ps例如busybox,您可以通过查看的时间戳获取进程的开始时间/proc/<PID>。例如,如果您要查看的pid是55 ...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55

...然后将其与当前日期进行比较...

# date
Thu May 22 03:00:47 EDT 2014

这似乎不再适用于当前的内核。
goertzenator

7

我认为您可以运行:

$ stat /proc/1234

进程ID为1234。

示例,其中两个进程在同一小时分钟数秒但不相同的毫秒数下启动:

$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100

4

这样简单的事情在5年后不能正确回答吗?

我认为您无法准确获得毫秒数。例如。如果你看到man procfs,看到/proc/$$/stat其中有22场作为STARTIME,这是在“时钟滴答”,你将有更多的东西精确,但是时钟滴答都没有完全恒定的速率会(相对于“挂钟时间”)和意志关闭...睡觉,某些事情(我猜是ntpd)抵消了它。例如,在运行ntpd的计算机上,该计算机具有8天的正常运行时间,并且从未休眠过,dmesg -T存在相同的问题(我认为...),您可以在这里看到它:

# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar  3 10:26:17 CET 2017
[Fri Mar  3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w) 
Fri Mar  3 10:26:17 CET 2017

这是几秒钟:

# example pid here is just your shell
pid=$$

# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)

# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")

# simple subtraction (both are in UTC, so it works)
age=$((now-start))

printf "that process has run for %s seconds\n" "$age"

3

是的,东西太旧但太难了。我尝试了上述建议的“ stat”方法,但是如果昨天我“触摸”了PID proc目录,该怎么办?这意味着我的岁月程序显示在昨天的时间戳记中。不,不是我所需要的:(

在较新的版本中,它很简单:

ps -o etimes -p <PID>
ELAPSED
339521

就如此容易。时间以秒为单位。做任何您需要的事情。使用一些较旧的盒子,情况变得更困难,因为没有时间。一个可以依靠:

ps -o etime -p <PID>
ELAPSED
76-03:26:15

由于采用dd-hh:mm:ss格式,因此看起来有点“怪异”。不适合进一步计算。我本来希望在几秒钟内使用它,所以我使用了它:

ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544

这是在旧系统上执行此操作的一种非常不错的方法,谢谢:)
RobotJohnny18年

不要解析etime的输出,因为busybox 1.29.3更改了格式。使用stat + / proc方法代替
Danny Dulai 18-10-5

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => Java进程的进程ID

etimes= =>时间以秒为单位,“ =”表示删除标题

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.