You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu下追踪已长时间运行进程并记录总运行时间的方法

追踪运行中进程的总时长(结束后获取)

当然有办法解决这个问题!Ubuntu默认不会自动保存已结束进程的完整运行时长,不过我们可以通过几个手动追踪的方案来实现你的需求:

方案一:用wait命令后台等待进程结束并记录

这是最直接的方法,适合你现在的场景——进程还在运行,我们可以写个简单的脚本后台挂着,等进程结束后自动计算并保存时长。

  1. 首先找到目标进程的PID,用ps aux | grep "你的进程名"或者pgrep 进程名获取。
  2. 创建一个追踪脚本(比如track_runtime.sh):
#!/bin/bash
# 替换成你要追踪的进程PID
TARGET_PID=12345

# 等待进程结束
wait $TARGET_PID

# 获取并格式化总运行时长(etimes是进程启动到现在的总秒数)
RUNTIME_SEC=$(ps -o etimes= -p $TARGET_PID)
HOURS=$((RUNTIME_SEC / 3600))
MINUTES=$(((RUNTIME_SEC % 3600) / 60))
SECONDS=$((RUNTIME_SEC % 60))

# 保存到日志文件
LOG_FILE="process_runtime_${TARGET_PID}.log"
echo "进程PID: $TARGET_PID" > $LOG_FILE
echo "结束时间: $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG_FILE
echo "总运行时长: ${HOURS}小时 ${MINUTES}分钟 ${SECONDS}秒" >> $LOG_FILE

echo "已记录进程$TARGET_PID 的运行时长到 $LOG_FILE"
  1. 给脚本加执行权限:chmod +x track_runtime.sh
  2. 后台运行脚本(就算关闭终端也能继续执行):nohup ./track_runtime.sh &

方案二:提前记录进程启动时间,结束后计算时长

如果不想用wait挂着脚本,也可以先记录进程的启动时间戳,等进程结束后再计算总时长。

  1. 先记录目标进程的启动jiffies(系统启动以来的时钟周期,Ubuntu默认是100Hz,即每个jiffy为10ms):
TARGET_PID=12345
# 从/proc/$PID/stat中提取启动时间(第22个字段)
cat /proc/$TARGET_PID/stat | awk '{print $22}' > "/tmp/pid_${TARGET_PID}_start_jiffies"
  1. 等进程结束后,运行下面的脚本计算时长:
#!/bin/bash
TARGET_PID=12345
START_JIFFIES=$(cat "/tmp/pid_${TARGET_PID}_start_jiffies")

# 获取系统当前的总jiffies(/proc/uptime的第一个字段是系统运行秒数,乘以100转成jiffies)
CURRENT_UPTIME_SEC=$(awk '{print $1}' /proc/uptime)
CURRENT_JIFFIES=$(echo "$CURRENT_UPTIME_SEC * 100" | bc | awk '{print int($1)}')

# 计算总运行秒数
TOTAL_SEC=$(( (CURRENT_JIFFIES - START_JIFFIES) / 100 ))
HOURS=$((TOTAL_SEC / 3600))
MINUTES=$(((TOTAL_SEC % 3600) / 60))
SECONDS=$((TOTAL_SEC % 60))

echo "进程$TARGET_PID 的总运行时长: ${HOURS}小时 ${MINUTES}分钟 ${SECONDS}秒"

补充说明

  • 如果你只是想临时查看进程当前已运行的时长,直接用ps -o pid,etimes,cmd | grep $TARGET_PID,其中etimes列就是进程启动到现在的总秒数。
  • Ubuntu系统不会主动保留已结束进程的运行时长数据,所以必须提前做追踪操作,上面的两个方案都是基于提前记录关键信息来实现的。

内容的提问来源于stack exchange,提问作者jahavu

火山引擎 最新活动