【Linux 性能采集】定周期采集某进程的CPU、内存、文件描述符信息并存储到文件【2025.05.21】
定周期采集某进程的CPU、内存、文件描述符信息并存储到文件
采集原理是基于top命令提取关注的参数。输出到文件采用tee 命令,即在控制台窗口打印,也输出到文件。例如:./monitor.sh | tee 123.csv
代码如下:
```bash
#!/bin/bash# 配置部分
PROCESS_NAME="YourApp"
TIMESTAMP=$(date '+%Y%m%d_%H%M%S') # 获取当前时间戳
LOG_FILE="monitor_output_${TIMESTAMP}.csv" # 日志文件名带上时间戳# 清空日志文件(如果需要保留历史数据,请注释下一行)
> "$LOG_FILE"# 写入 CSV 头部
echo "Timestamp,PID,User,CPU(%),RSS(KB),FDs" > "$LOG_FILE"echo "Monitoring started at $(date)" | tee -a "$LOG_FILE"# 持续监控
while true; do# 获取PIDPID=$(pgrep -x "$PROCESS_NAME" | head -n1)if [ -z "$PID" ]; thenecho "$(date '+%Y-%m-%d %H:%M:%S'),,,Process $PROCESS_NAME not found." else# 使用 top 命令获取 CPU 使用率和 RSSCPU=$(top -b -n2 -p "$PID" |tail -n 1| awk '{print $9}') # 采集2次取第二次的数据MEM_RSS=$(top -b -n 1 -p "$PID" | grep "$PID" | awk '{print $6}') # RSS in KBUSER=$(top -b -n 1 -p "$PID" | grep "$PID" | awk '{print $2}')# 获取打开的文件描述符数量,并忽略 lsof 警告FD_COUNT=$(lsof -p "$PID" 2>/dev/null | wc -l)# 写入日志文件(CSV 格式)echo "$(date '+%Y-%m-%d %H:%M:%S'),$PID,$USER,$CPU,$MEM_RSS,$FD_COUNT"fi# 等待5秒sleep 5
done