You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本启停进程查找PID并获取用户态、系统态运行时间问题

Bash脚本后台运行可中断程序并统计运行时间方案

原有代码问题

  • 直接前台执行./cpu会阻塞脚本执行,后续的信号捕获、循环逻辑完全无法运行,只有手动终止./cpu后才会继续执行
  • 信号捕获trap设置时机过晚,且未关联到目标程序的停止逻辑

实现逻辑

  1. 后台启动目标程序,通过内置变量$!直接获取其PID
  2. 提前设置INT信号捕获,收到ctrl+C中断信号时,先给目标后台进程发送INT信号模拟手动停止操作,再进入统计流程
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:48:00