bash on进程中的练习

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

我正在练习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$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