监视和计时已运行的进程并将总运行时间保存到文件中

监视和计时已运行的进程并将总运行时间保存到文件中

我有几个不同的进程已经运行了很长时间(200 小时)。我刚刚意识到我忘了使用命令time来获取最后的总运行时间。

这些是我感兴趣的过程:

$ pidof perl
5897 5895 5890 5885 5797

这些进程目前正在运行,一旦它们完成,我想知道它们需要多长时间才能完成。

有什么方法可以跟踪这些进程并在完成后保存总运行时间?或者 Ubuntu 是否在某处保留了此类信息?

答案1

你可以监视一个正在运行的进程,例如 PID 为 12345 的进程,并确定它退出后的总运行时间(以秒为单位),如下所示:

startdate="$(ps -o lstart= 12345)" 
while ps 12345 &>/dev/null ; do sleep 1 ; done 
bc <<< "$(date +%s) - $(date -d "$startdate" +%s)"

这首先lstart使用 读取进程的属性ps,其中包含确切的开始日期字符串。我们必须在进程仍在运行时记住这一点,并将其存储在名为 的 shell 变量中startdate

然后,我们通过检查每秒的状态来等待进程仍在运行ps 12345,因为如果没有找到匹配的进程,它将以非零状态退出。

一旦进程退出,我们从当前时间中减去开始时间,两者都转换为自纪元以来的秒数,使用bc并将结果视为以秒为单位的时间跨度。

答案2

如果您具有 root 访问权限,则可以连接strace到它们并查看它们何时退出。例如,我sleep 1m在一个终端上运行,在另一个终端上运行:

% sudo strace -ttte exit_group -p $(pgrep sleep -n)
strace: Process 11637 attached
1520303315.074384 exit_group(0)         = ?
1520303315.074525 +++ exited with 0 +++

strace选项

-t         Prefix each line of the trace with the time of day.

-tt        If  given  twice,  the time printed will include the
           microseconds.

-ttt       If given thrice, the time printed will  include  the
           microseconds and the leading portion will be printed
           as the number of seconds since the epoch.

-e expr    A  qualifying expression which modifies which events
           to trace or how to trace them.

你可以用 附加多个 PID strace,例如:

sudo strace -ttte exit_group -p "$(pidof perl)"

答案3

您可以从 /proc/$pid/stat 文件中提取正在运行的进程所消耗的用户和系统时间。例如,如果您想从进程 3628 获取用户时间,请使用:

echo "scale=2; $(cat /proc/3628/stat | cut -d' ' -f14) / $(getconf CLK_TCK)" | bc

.. 以上提取字段 14(时钟滴答中的用户时间)并将其除以时钟滴答率,以计算以秒为单位的用户时间,精确到小数点后 2 位。

对于系统时间,使用字段 15,例如:

echo "scale=2; $(cat /proc/3628/stat | cut -d' ' -f15) / $(getconf CLK_TCK)" | bc

以下是分配 shell 变量的一个解决方案:

PID=1327
USRTIME=`echo "scale=2; $(cat /proc/$PID/stat | cut -d' ' -f14) / $(getconf CLK_TCK)" | bc`
SYSTIME=`echo "scale=2; $(cat /proc/$PID/stat | cut -d' ' -f15) / $(getconf CLK_TCK)" | bc`
echo "Time: USR: $USRTIME SYS: $SYSTIME"

相关内容