Ubuntu下追踪已长时间运行进程并记录总运行时间的方法
追踪运行中进程的总时长(结束后获取)
当然有办法解决这个问题!Ubuntu默认不会自动保存已结束进程的完整运行时长,不过我们可以通过几个手动追踪的方案来实现你的需求:
方案一:用wait命令后台等待进程结束并记录
这是最直接的方法,适合你现在的场景——进程还在运行,我们可以写个简单的脚本后台挂着,等进程结束后自动计算并保存时长。
- 首先找到目标进程的PID,用
ps aux | grep "你的进程名"或者pgrep 进程名获取。 - 创建一个追踪脚本(比如
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"
- 给脚本加执行权限:
chmod +x track_runtime.sh - 后台运行脚本(就算关闭终端也能继续执行):
nohup ./track_runtime.sh &
方案二:提前记录进程启动时间,结束后计算时长
如果不想用wait挂着脚本,也可以先记录进程的启动时间戳,等进程结束后再计算总时长。
- 先记录目标进程的启动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"
- 等进程结束后,运行下面的脚本计算时长:
#!/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




