mat*_*tdm 365
在带有psfrom 的Linux 上procps(-ng)(以及大多数其他系统,因为这是由 POSIX 指定的):
ps -o etime= -p "$$"
Run Code Online (Sandbox Code Playgroud)
$$要检查的进程的 PID在哪里。这将以 格式返回经过的时间[[dd-]hh:]mm:ss。
Using-o etime告诉ps你只想要经过时间字段,并且=在它的末尾抑制标题(没有,你会得到一行,ELAPSED然后是下一行的时间;使用,你只得到一行时间) .
或者,在 Linux 或 FreeBSD 9.0 或更高版本(以及其他可能)上使用较新版本的 procps-ng 工具套件(3.3.0 或更高版本),使用:
ps -o etimes= -p "$$"
Run Code Online (Sandbox Code Playgroud)
(添加s) 将时间格式化为秒,这在脚本中更有用。
在 Linux 上,ps程序从 获取它/proc/$$/stat,其中一个字段(参见man proc)是进程启动时间。不幸的是,这被指定为自系统启动以来以 jiffies(Linux 内核中使用的任意时间计数器)为单位的时间。因此,您必须确定系统启动的时间(从/proc/stat)、该系统上每秒的 jiffies 数量,然后进行数学计算以使用有用的格式获得经过的时间。
事实证明,找到 HZ 的值(即每秒 jiffies)是非常复杂的。根据sysinfo.cprocps 包中的注释,可以 A) 包含内核头文件并在使用不同的内核时重新编译,B) 使用 posixsysconf()函数,遗憾的是,该函数使用编译到 C 库中的硬编码值,或C) 询问内核,但没有官方接口可以做到这一点。因此,该ps代码包含一系列用于确定正确值的杂项。哇。
因此ps,为您完成这一切很方便。:)
正如用户@336_ 所指出的,在 Linux(这不可移植)上,您可以使用该stat命令查看目录的访问、修改或状态更改日期/proc/$$(这里又$$是感兴趣的进程)。所有三个数字应该相同,所以
stat -c%X /proc/$$
Run Code Online (Sandbox Code Playgroud)
将为您提供该过程$$开始的时间,以自纪元以来的秒数为单位。这仍然不是您想要的,因为您仍然需要进行数学运算以从当前时间中减去它以获得经过的时间 - 我想类似的方法date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"会起作用,但有点笨拙。一个可能的优势是,如果您使用长格式输出,-c%x而不是-c%X,您将获得比整数秒更高的分辨率。但是,如果您需要这样做,您可能应该使用流程审计方法,因为运行 stat 命令的时间会影响准确性。
Gil*_*il' 40
便携的:
% ps -o stime,time $$
STIME TIME
Jan30 00:00:06
Run Code Online (Sandbox Code Playgroud)
即,shell 于 1 月 30 日启动,总共占用了大约 6 秒的 CPU 时间。
可能有更精确或更可解析但不太便携的方法来获取此信息。检查您的ps命令或proc文件系统的文档。
在 Linux 下,这些信息存在于/proc/$pid/stat.
awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat
Run Code Online (Sandbox Code Playgroud)
CPU 时间以 jiffies 为单位;我不知道如何从 shell 中找到 jiffy 值。开始时间相对于启动时间(在 中找到/proc/uptime)。
mez*_*ezi 22
ps -eo pid,comm,cmd,start,etime | grep -i X
Run Code Online (Sandbox Code Playgroud)
X 是进程的名称
Mic*_*zek 14
ps接受一个-o选项来指定输出格式,可用列之一是etime. 根据手册页:
etime - 自进程启动以来经过的时间,格式为 [[dd-]hh:]mm:ss。
因此,您可以运行它来获取每个进程的 PID 和经过时间:
$ ps -eo pid,etime
Run Code Online (Sandbox Code Playgroud)
如果您想要特定 PID(例如 12345)的经过时间,您可以执行以下操作:
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
Run Code Online (Sandbox Code Playgroud)
(编辑:结果是上述命令的语法更短;请参阅mattdm 的答案)
不确定为什么还没有建议这样做:在 Linux 上,您可以stat()在 /proc/[nnn] 目录中找到您的 PID。
此行为明确设计为返回进程启动时间,它可以在高分辨率下执行,并且内核可以在没有 jiffies hack 的情况下准确执行,因为内核可以(显然)简单地检查相关信息。访问、数据修改和状态更改字段都返回进程开始时间。
最重要的是,您可以stat(1)在 shell 中使用,或者stat(2)从 $favorite_programming_language 中使用适当的绑定,因此您甚至可能不需要启动外部进程。
注意,这并不会与工作/usr/compat/linux/proc在FreeBSD; 返回的访问/修改/状态变化时间是当前时间,出生时间是UNIX纪元。如果你问我,支持不存在,这很愚蠢。