如何在已经开始的情况下获得Linux进程的执行时间


假设您在服务器中发出了一个命令。通常,该命令可能备份某些内容或执行关键的修补程序。

当然,您知道进程的开始时间。但什么时候结束呢?在流程已经启动的情况下,如何查找执行时间?

获取正在运行的进程的开始时间是很容易的。使用psCLI或查询/进程直接使用文件系统。

经由ps命令行:

# Show process start time by pid
ps -o lstart= -p $pid

# Show process start time, cmd by pid.
ps -o lstart,cmd $pid

通过/proc直接使用文件系统:

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

获取进程执行时间是如果我们可以控制它的启动方式。简单地使用time $command

通过添加time作为前缀。超级容易。不是吗?

time cp /etc/hosts /tmp/ 
# real 0m0.004s 
# user 0m0.000s 
# sys 0m0.000s 

但是如果您忘记添加time前缀,你不知道什么时候能完成?如何在进程已经运行的情况下仍然获得执行时间?

好吧,你肯定可以一直看着屏幕,迟早会弄明白的。但专业人士不会这么做的。那很无聊又浪费时间。

我们都知道watch指挥,对吧?

tee命令可能不太为人所知。它从标准输入读取,并同时写入标准输出和文件。

# Record process start time to a log file
ps -o lstart= -p $pid > /tmp/watch_process_$pid.log

# Check process every 2 seconds, using watch command.
# When process is running, record current time to log file
watch "ps -o lstart= -p $pid && \
  (date | tee -a /tmp/watch_process_$pid.log)"

从日志文件中,我们可以得到:

  • 日志文件第一个条目的进程开始时间。
  • 日志文件最后一个条目的结束时间。

为什么?如果进程已完成,则ps命令将失败,以下子句将被跳过。因此,使用这种方法,我们可以监视任何现有的进程。听起来很棒,不是吗?

有进一步的改进吗?

您可以在流程结束时获得及时通知。这个过程可能已经在您甚至记得登录并通过日志文件检查状态之前完成了几个小时。

假设你已经结束了send_alert.sh。此脚本将正确发送警报。稍作改动,您就会得到正确的警报。

# Record process start time to a log file
ps -o lstart= -p $pid > /tmp/watch_process_$pid.log

# Check process every 2 seconds, using watch command.
# When process is running, record current time to log file.
# When process has finished, send_alert.sh will be executed.
watch "(ps -o lstart= -p $pid || (send_alert.sh && false)) \
  && date | tee -a /tmp/watch_process_$pid.log"


那我们就都准备好了!