如何查看一个进程已经运行了多长时间?

如何查看一个进程已经运行了多长时间?

我想通过从监控应用程序启动进程来避免这样做。

答案1

ps在带有from 的Linux 上procps(-ng)(以及大多数其他系统,因为这是由 POSIX 指定的):

ps -o etime= -p "$$" 

$$你要检查的进程的PID在哪里?这将以格式返回经过的时间[[dd-]hh:]mm:ss

使用-o etime告诉ps您只需要经过的时间字段,并且=其末尾的 抑制标题(如果没有,您会得到一行ELAPSED,然后是下一行的时间;使用,您只会得到一行包含时间的内容) 。

或者,对于 Linux 或 FreeBSD 9.0 或更高版本(也可能是其他版本)上较新版本的 procps-ng 工具套件(3.3.0 或更高版本),请使用:

ps -o etimes= -p "$$"

(添加s) 来获取格式化为秒的时间,这在脚本中更有用。

在 Linux 上,ps程序从 获取此信息/proc/$$/stat,其中字段之一(请参阅man proc)是进程启动时间。不幸的是,这被指定为系统启动以来的 jiffies 时间(Linux 内核中使用的任意时间计数器)。因此,您必须确定系统启动的时间(从/proc/stat)、该系统每秒的 jiffies 数,然后进行数学计算,以有用的格式获取经过的时间。

事实证明,找到 HZ(即每秒 jiffies)的值极其复杂。根据 procps 包中的注释sysinfo.c,可以 A) 包含内核头文件并在使用不同内核时重新编译,B) 使用 posixsysconf()函数,遗憾的是,该函数使用编译到 C 库中的硬编码值,或者C) 询问内核,但没有官方接口可以做到这一点。因此,该ps代码包含一系列的拼凑,通过这些拼凑来确定正确的值。哇。

ps所以这一切都为您完成,非常方便。 :)

(笔记:stat -c%X /proc/$$ 不起作用。看Stéphane Chazelas 对相关问题的回答.)

答案2

便携的:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

即该 shell 于 1 月 30 日启动,总共占用了大约 6 秒的 CPU 时间。

可能有更精确或更可解析但可移植性较差的方法来获取此信息。检查ps命令或文件系统的文档proc

在 Linux 下,这些信息位于/proc/$pid/stat

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

CPU 时间以 jiffies 为单位;我不知道如何从 shell 中找到 jiffy 值。开始时间与启动时间相关(可在 中找到/proc/uptime)。

答案3

如果您不知道进程的 PID,只知道名称:

ps -eo pid,comm,cmd,start,etime | grep -i <name of the process>

如果你知道 PID:

ps -o pid,comm,cmd,start,etime -p <PID>

答案4

不确定为什么还没有建议:在Linux上您可以stat()在 /proc/[nnn] 目录中查找您的 PID。

此行为明确设计为返回进程启动时间,它可以以高分辨率执行此操作,并且内核可以在没有 jiffies hacks 的情况下准确执行此操作,因为内核可以(显然)简单地检查相关信息。访问、数据修改和状态更改字段都返回进程开始时间。

最重要的是,您可以stat(1)在 shell 上使用,或者stat(2)从 $favorite_programming_language 进行适当的绑定,因此您甚至可能不需要启动外部进程。

笔记这确实不是/usr/compat/linux/proc在FreeBSD 上工作;返回的访问/修改/状态更改时间是当前时间,出生时间是 UNIX 纪元。如果你问我的话,我就不提供支持,这太愚蠢了。

相关内容