bash on进程中的练习
我正在练习bash,但是在这个练习中我遇到了很大的问题,你能帮我吗 以下是练习: 制作一个shell脚本,该脚本将列出所有进程数小于root且%mem大于至少一个root进程的用户。对于此类用户,脚本将创建一个文件.txt,其中列出此类进程的PID、PPID、%MEM 遗憾的是,我的尝试根本不起作用,它在第7行“ps:等待整数表达式”报告了一个问题bash on进程中的练习,bash,Bash,我正在练习bash,但是在这个练习中我遇到了很大的问题,你能帮我吗 以下是练习: 制作一个shell脚本,该脚本将列出所有进程数小于root且%mem大于至少一个root进程的用户。对于此类用户,脚本将创建一个文件.txt,其中列出此类进程的PID、PPID、%MEM 遗憾的是,我的尝试根本不起作用,它在第7行“ps:等待整数表达式”报告了一个问题 #/bin/bash N_root=$(ps hax-o user | sort | uniq-c | grep root | awk'{print
#/bin/bash
N_root=$(ps hax-o user | sort | uniq-c | grep root | awk'{print$1}')#这里我保存了root有多少进程
mem|u root=$(ps-u root-o%mem | sort | head-1)#我保存根的最低%mem
对于以美元表示的i(ps hax-o user | sort | uniq-c | sed'/root/d')列出所有进程
做
如果[$(echo$i | awk'{print$1}')-lt$N#root]#我检查此用户的进程是否少于root
然后
user=$(echo$i | awk'{print$2}')#我保存用户的名称
如果[$(ps-u$user-o%mem | sort-r | head-1)-gt$mem|root]#检查最大%mem是否大于根的最低%mem
然后
echo$user
touch.txt#创建文件“.txt”
对于$中的p(ps-u$user-o%mem,pid,ppid | sed'/pid/d'| sort-r)#列出当前用户的所有进程($n)
做
如果[$(echo$p | awk'{print$1}')-gt$mem#root]#检查进程的%mem是否大于root
然后
echo$p>>“.txt”#正在文件中复制%mem、pid、ppid
fi
完成
fi
fi
完成
有很多方法可以实现这一点。对于多重比较,我通常喜欢将值索引到数组中,然后使用单个循环通过值执行比较(如果可能)。应用于您的问题,它可能如下所示:
#!/bin/bash
## set output filename
ofn=./userpctmem.txt
## arrays to hold procs, users, and %mem
declare -a procarray
declare -a userarray
declare -a memarray
## read values into arrays
while read -r pval uval || [ -n "$uval" ]; do
procarray+=( "$pval" )
userarray+=( "$uval" )
memarray+=( $(ps -u "$uval" -o %mem | grep -v '%' | sort -r | head -n 1) )
done <<<"$(ps hax -o user | sort | uniq -c)"
## save root procs and %mem in separate variables for convenience
rproc=$(ps -u root | tail -n +2 | wc -l)
rmem=$(ps -u root -o %mem | grep -v '%' | sort -r | head -n 1)
## get the number of users found
nusers=${#userarray[@]}
## print the captured data (for verification)
printf "\n%-12s %-6s %s\n\n" "user" "nprocs" "maxmem"
for ((i=0; i<$nusers; i++)); do
printf " %-12s %5s %s \n" "${userarray[i]}" "${procarray[i]}" "${memarray[i]}"
done
## test user process less than root and %mem >= root (max %mem process)
# and write matching users to output
printf "\nUsers with nprocs less than root and %%mem at least as great as root\n\n"
for ((i=0; i<$nusers; i++)); do
[ "${userarray[i]}" == 'root' ] && continue
umem="${memarray[i]}"
if [ "${umem//.*/}" -ge "${rmem//.*/}" -a "${procarray[i]}" -lt "$rproc" ]; then
printf " %s has process with %%mem: %s, root %%mem: %s\n" "${userarray[i]}" "$umem" "$rmem" | tee -a "$ofn"
fi
done
printf "\n"
exit 0
输出文件:
alchemy:~/scr/tmp/stack> bash procmem.sh
user nprocs maxmem
avahi 1 0.0
david 68 18.7
man 2 0.0
messagebus 1 0.0
nscd 1 0.0
ntp 1 0.0
polkitd 1 0.5
postfix 2 0.0
root 105 2.8
Users with nprocs less than root and %mem at least as great as root
david has process with %mem: 18.7, root %mem: 2.8
alchemy:~/scr/tmp/stack> cat userpctmem.txt
david has process with %mem: 18.7, root %mem: 2.8
注意:为最大%MEM的进程检索PID和PPID留作练习。如果您在尝试后遇到困难,请删除一条评论,我将向您展示一种捕获它的方法。请在帖子中添加脚本和错误的副本,并选择一个有意义的标题。检查内存差异的脚本不会使用CPU。。。所以,这里有一些区别,你需要什么,你在做什么…看看你的脚本不采取输入参数。请选择更好的变量名:r、m、n、u、i——没有意义您是否遇到行号错误?也许有什么东西能告诉我们问题所在?您是否已将
set-xv
放在脚本的顶部。这将生成每个命令的逐行执行输出。您可以使用这些信息来帮助查找问题所在。非常感谢您的帮助!但是,不幸的是,在我们的课程中,我们并没有研究Bash中的任何数据结构,所以目前数组对我来说超出了范围。我仍然感谢你花时间帮助我。
alchemy:~/scr/tmp/stack> cat userpctmem.txt
david has process with %mem: 18.7, root %mem: 2.8