查看当前各个CPU分别绑定了哪些进程

查看当前各个CPU分别绑定了哪些进程

sudo apt update
sudo apt install taskset
#!/bin/bash

# 获取系统的 CPU 核心数
cpu_count=$(nproc)

# 获取所有进程的 PID
pids=$(ps -eo pid)

# 初始化每个 CPU 核心的进程列表
declare -A cpu_processes

# 初始化动态进程列表
dynamic_processes=()

# 遍历每个进程,查看其 CPU 亲和性
for pid in $pids; do
    # 使用 taskset 获取当前进程的 CPU 亲和性
    affinity=$(taskset -p $pid 2>/dev/null | awk -F: '{print $2}' | tr -d '[:space:]')

    # 如果 taskset 命令失败(即亲和性为空),跳过该进程
    if [ -z "$affinity" ]; then
        continue
    fi

    # 输出每个进程的 PID 和亲和性,帮助调试
    # echo "PID $pid 的亲和性是: $affinity"
    
    if [ "$affinity" == "f" ]; then
        # 如果亲和性是 f,认为是动态进程
        dynamic_processes+=($pid)
    else
        # 否则解析二进制亲和性,找出对应的 CPU 核心
        # 将十六进制亲和性转换为二进制
        binary_affinity=$(echo "obase=2; ibase=16; $affinity" | bc)
        
        # 确保二进制亲和性是正确长度
        binary_affinity=$(printf "%0${cpu_count}d" $binary_affinity)

        # 根据二进制亲和性将进程分配到相应的 CPU 核心
        for ((i = 0; i < cpu_count; i++)); do
            if [ "${binary_affinity:$i:1}" == "1" ]; then
                if [ -z "${cpu_processes[$i]}" ]; then
                    cpu_processes[$i]=$pid
                else
                    cpu_processes[$i]="${cpu_processes[$i]} $pid"
                fi
            fi
        done
    fi
done

# 输出每个 CPU 核心上的进程
for ((i = 0; i < cpu_count; i++)); do
    echo "cpu$(($i+1)) 上有进程:"
    if [ -z "${cpu_processes[$i]}" ]; then
        echo "没有进程"
    else
        echo ${cpu_processes[$i]}
    fi
done

# 输出动态进程
echo "动态进程:"
if [ ${#dynamic_processes[@]} -eq 0 ]; then
    echo "没有动态进程"
else
    for pid in "${dynamic_processes[@]}"; do
        echo $pid
    done
fi
read
posted @ 2024-12-26 11:38  Sudayo  阅读(117)  评论(0)    收藏  举报