Bash脚本启停进程查找PID并获取用户态、系统态运行时间问题
Bash脚本后台运行可中断程序并统计运行时间方案
原有代码问题
- 直接前台执行
./cpu会阻塞脚本执行,后续的信号捕获、循环逻辑完全无法运行,只有手动终止./cpu后才会继续执行 - 信号捕获
trap设置时机过晚,且未关联到目标程序的停止逻辑
实现逻辑
- 后台启动目标程序,通过内置变量
$!直接获取其PID - 提前设置INT信号捕获,收到ctrl+C中断信号时,先给目标后台进程发送INT信号模拟手动停止操作,再进入统计流程
- 通过
wait命令阻塞脚本等待目标进程退出,进程结束后通过ps命令读取所需的时间指标
完整可运行脚本
#!/bin/bash clarg="$1" if [ "$clarg" == "cpu" ] ; then # 编译目标程序,编译失败直接退出 gcc -o cpu cpu.c || exit 1 # 预先设置信号捕获规则:收到ctrl+C时终止后台运行的cpu进程 trap 'kill -INT $cpu_pid; echo "进程已停止,正在统计运行数据..."' INT # 后台启动目标程序,记录PID ./cpu & cpu_pid=$! echo "目标程序已启动,PID:$cpu_pid,按ctrl+C停止并查看统计结果" # 等待目标进程结束(无论是被信号终止还是自然退出) wait $cpu_pid # 进程停止后输出统计信息 echo -e "\n=== 进程 $cpu_pid 运行统计结果 ===" ps -p $cpu_pid -o utime=,stime=,etime=,time= | awk '{ print "用户态CPU运行时间:" $1 print "系统态CPU运行时间:" $2 print "总运行时长(真实墙上时间):" $3 print "累计CPU总占用时间:" $4 }' # 若需要更精细的时间数值(单位为内核jiffies),可读取/proc文件系统 # utime_jiffies=$(awk '{print $14}' /proc/$cpu_pid/stat 2>/dev/null) # stime_jiffies=$(awk '{print $15}' /proc/$cpu_pid/stat 2>/dev/null) fi
补充说明
如果需要将时间转换为秒级数值做进一步计算,可读取/proc/$cpu_pid/stat的第14(用户态)、15(系统态)字段,将其值除以getconf CLK_TCK(内核时钟频率,一般为100)即可得到秒级CPU时间。
内容的提问来源于stack exchange,提问作者101001
相关产品推荐
相关产品推荐

