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
= 再次命令,这次是所有提供的选项和参数
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)
小智 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)
这么简单的事,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)
归档时间: |
|
查看次数: |
129502 次 |
最近记录: |