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

Mah*_*san 82 linux grep uptime process

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

ps aux | grep gedit | grep -v grep
Run Code Online (Sandbox Code Playgroud)

给了我很多信息,包括流程开始的时间。我特别在寻找以毫秒为单位返回进程正常运行时间的开关。

谢谢

Abd*_*ull 135

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

ps -eo pid,comm,lstart,etime,time,args
Run Code Online (Sandbox Code Playgroud)

此命令列出了具有多个不同时间相关列的所有进程。它具有以下列:

PID COMMAND                          STARTED     ELAPSED     TIME COMMAND
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。我自己更喜欢“etimes” - 以秒为单位的经过时间 - 所以它是机器可读的 (2认同)

goe*_*tor 15

如果您在ps中找到了诸如此类的受限版本,则busybox可以通过查看 的时间戳来获取进程开始时间/proc/<PID>。例如,如果您要查看的 pid 是 55...

# ls -al /proc | grep 55
dr-xr-xr-x    7 root     root             0 May 21 05:53 55
Run Code Online (Sandbox Code Playgroud)

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

# date
Thu May 22 03:00:47 EDT 2014
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不再适用于当前的内核。 (2认同)

小智 8

我认为你可以运行:

$ stat /proc/1234
Run Code Online (Sandbox Code Playgroud)

1234 是进程 ID。

两个进程在同一小时分秒但不同毫秒启动的示例:

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


小智 6

是的,太老了,但太难了。我尝试了上面提出的“stat”方法,但是如果我昨天“触摸”了 PID proc 目录呢?这意味着我的一年前的过程显示有昨天的时间戳。不,不是我需要的:(

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

ps -o etimes -p <PID>
ELAPSED
339521
Run Code Online (Sandbox Code Playgroud)

就如此容易。时间以秒为单位。做任何你需要的事情。对于一些较旧的盒子,情况会更糟,因为没有 etimes。人们可以依靠:

ps -o etime -p <PID>
ELAPSED
76-03:26:15
Run Code Online (Sandbox Code Playgroud)

看起来“有点”奇怪,因为它是 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
Run Code Online (Sandbox Code Playgroud)


Pet*_*ter 5

这么简单的事,5年了还不好回答?

我认为您无法准确获得毫秒。例如。如果您看到man procfs并看到/proc/$$/stat哪个字段 22 作为起始时间,即在“时钟滴答”中,您将获得更精确的信息,但时钟滴答不会以完全恒定的速率运行(相对于“挂钟时间”)并且会离开......睡觉和某些事情(我猜是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
Run Code Online (Sandbox Code Playgroud)

这里是秒:

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