查看当前各个CPU分别绑定了哪些进程
#!/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
标签:processes,168d356f35e5803fa67df39f5f50a54d,亲和性,绑定,pid,cpu,进程,CPU
From: https://www.cnblogs.com/sudayo/p/18632367