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

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

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

ps aux | grep gedit | grep -v grep

为我提供了大量信息,包括进程启动的时间。我专门寻找能够以毫秒为单位返回进程正常运行时间的开关。

谢谢

答案1

由于“uptime”有多种含义,这里有一个有用的命令。

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= 再次执行命令,这次带有其提供的所有选项和参数

答案2

如果您拥有的受限版本(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

答案3

我认为你可以直接运行:

$ stat /proc/1234

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

答案4

这么简单的问题五年了还没有得到妥善的解答吗?

我认为您无法准确获得毫秒。例如,如果您看到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

以下是秒数:

# 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"

相关内容