【ubuntu】查看服务器上的进程占用GPU情况
参考《shell脚本显示GPU进程所属docker 容器》
该博客是读取nvidia-smi
信息后处理为奇数行为进程ID,偶数行为显存占用,作者改为多读取了GPU编号(判断该行的信息是否为一位整数,前提是进程ID不可能为一位整数)
#!/bin/bash
# find docker container by process id
processId=
# 提取程序的名字
PROGNAME=$(basename $0)
usage () {
echo " $PROGNAME [-p --processId] or $PROGNAME"
return
}
# 一个while case用来提取参数
while [[ -n $1 ]]; do
case $1 in
-p | --processId) shift
processId=$1
;;
-h | --help) usage
exit
;;
*) usage >&2
exit 1
;;
esac
shift
done
# 定义一个函数
findCon () {
# $1 是函数的输入
local pId=$1
# awk '{print $1,$NF}' 打印第一列和最后一列,即容器ID和容器Name,awk 'NR != 1' 不打印第一行
# read代表读入变量
docker ps | awk '{print $1,$NF}' | awk 'NR != 1' | while read conId conName; do
# 对pId的grep使用正则表达式,不然的话如果输入进程pId为21则会匹配到21274,通过前后加入空格匹配就可以防止出现这种问题
local temp="[[:space:]]\{1\}${pId}[[:space:]]\{1\}"
if [[ -n $(docker top $conId | grep -e $temp) ]]; then
printf "%s\t\t%s\t\t%s\t\t\n" $pId $conId $conName
break
fi
done
return
}
# 定义一个函数
findConWithGPU () {
# $1 是函数的输入
local pId=$1
local gpuId=$2
# awk '{print $1,$NF}' 打印第一列和最后一列,即容器ID和容器Name,awk 'NR != 1' 不打印第一行
# read代表读入变量
docker ps | awk '{print $1,$NF}' | awk 'NR != 1' | while read conId conName; do
# 对pId的grep使用正则表达式,不然的话如果输入进程pId为21则会匹配到21274,通过前后加入空格匹配就可以防止出现这种问题
local temp="[[:space:]]\{1\}${pId}[[:space:]]\{1\}"
if [[ -n $(docker top $conId | grep -e $temp) ]]; then
printf "%s\t%s\t\t%s\t\t%s\t\t" $gpuId $pId $conId $conName
break
fi
done
return
}
# 如果 $processId不为空
if [[ -n $processId ]]; then
# 判断输入是否为数字
if [[ $processId =~ ^[0-9]+$ ]]; then
# printf "conId%s\t\t\tconName%s\n" $conId $conName
printf "PID\t\tconId\t\t\tconName\n"
findCon $processId
else
echo "Please input number"
exit 1
fi
else
num=0
gpunum=0
printf "GPU\tPID\t\tconId%s\t\t\tconName%s\t\t\tGPU Memory\n" $conId $conName
# 这一串awk操作为提取进程id和GPU使用情况,然后去掉空格,-F为设定awk分隔符,在命令行输出一边就看懂了
nvidia-smi -q 2>&1| awk '/Process ID|Used GPU Memory|Minor Number/' | awk '{gsub(/[[:blank:]]*/,"",$0);print $0}' | awk -F ":" '{print $NF}' | while read item; do
if [[ $item =~ ^[0-9]$ ]]; then
# printf "gpunum\n"
gpunum=$(($item))
else
num=$((num+1))
if [[ $(($num % 2)) != 0 ]]; then
findConWithGPU $item $gpunum
else
printf "%s\n" $item
fi
fi
done
fi