我想通过从监控应用程序启动进程来避免这样做。
答案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 纪元。如果你问我的话,我就不提供支持,这太愚蠢了。