我有几个不同的进程已经运行了很长时间(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"