it-swarm.cn

如何检查进程运行了多长时间?

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

250
tshepang

在具有procps(-ng)ps的Linux上(以及大多数其他系统,因为这是由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_),该系统上每秒的跳动次数,然后进行数学计算以获得有用的格式。

找出HZ的值(即每秒jiffies)变得非常复杂。从procps软件包中_sysinfo.c_的注释中,可以A)包含内核头文件并在使用其他内核的情况下重新编译; B)使用posix sysconf()函数,可悲的是,使用编译到C库中的硬编码值,或者C)向内核询问,但是没有官方接口可以这样做。因此,ps代码包括一系列kludge,通过它们可以确定正确的值。哇。

因此,ps为您完成所有操作很方便。 :)

正如用户@ 336_所指出的那样,在Linux(这是不可移植的)上,可以使用stat命令查看_/proc/$$_目录的访问,修改或状态更改日期(其中_$$_是感兴趣的过程)。三个数字都应该相同,所以

_stat -c%X /proc/$$
_

自纪元以来的几秒钟内,您将获得_$$_进程开始的时间。那仍然不是您想要的,因为您仍然需要进行数学运算以从当前时间中减去该时间来获得经过的时间-我猜像date +%s --date="now - $( stat -c%X /proc/$$ ) seconds"会起作用,但是有点笨拙。一个可能的优点是,如果使用_-c%x_之类的长格式输出而不是_-c%X_,则得到的分辨率要大于整数秒。但是,如果需要,则可能应该使用过程审核方法,因为运行stat命令的时间会影响准确性。

324
mattdm

便携式:

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

即Shell于1月30日启动,总共耗时约6秒。

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

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

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

CPU时间紧张。我不知道如何从Shell中找到Jiffy值。开始时间与引导时间有关(位于/proc/uptime)。

36
ps -eo pid,comm,cmd,start,etime | grep -i X

X是进程的名称

19
mezi

ps-o选项指定输出格式,可用列之一是etime。根据手册页:

etime-自进程开始以来经过的时间,格式为[[dd-] hh:] mm:ss。

因此,您可以运行此命令以获取每个进程的PID和已用时间:

$ ps -eo pid,etime

如果您想要特定PID的经过时间(例如12345),则可以执行以下操作:

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

((编辑:上面的命令的语法较短;请参阅 mattdm的答案

13
Michael Mrozek

不确定为何尚未建议这样做:在Linux上,您可以stat()/proc/[nnn]目录作为PID。

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

最棒的是,您可以在命令行管理程序中使用stat(1),或从$ favorite_programming_language适当地绑定到stat(2),因此,您甚至不必启动外部进程。

[〜#〜]请注意[〜#〜]这样做不是/usr/compat/linux/proc在FreeBSD上;返回的访问/修改/状态更改时间是当前时间,而出生时间是UNIX时代。如果您问我,那是很愚蠢的支持不存在的地方。

5
i336_

如果您可以运行时间然后执行命令,那么您将获得所需的确切信息。您不能对已经运行的命令执行此操作。

[0]睡眠时间百分比20

睡眠20 0.00s用户0.00s系统0%cpu 20.014

2
slashdot

$ ps -eo lstart获取开始时间

$ ps -eo etime获取持续时间/经过时间

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819是进程ID。

2
Terry wang

经过的时间(以秒为单位):expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)

1
Shardj

您可以通过查看stat生成的stat文件的proc来获取该过程的开始时间,使用date对其进行格式化并从当前时间中减去它:

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494是您的进程的pid

1
bobbins