Linux 如何通过管道输送“的所有输出”;ps";转换为shell脚本以进行进一步处理?
运行此命令时:Linux 如何通过管道输送“的所有输出”;ps";转换为shell脚本以进行进一步处理?,linux,bash,shell,ps,Linux,Bash,Shell,Ps,运行此命令时: ps aux|awk {'print $1,$2,$3,$11'} 我得到了用户、PID、CPU%和实际命令的列表。 我想将所有这些列表导入一个shell脚本来计算CPU%,如果CPU%大于,比如5,则通过PID终止进程 我试着用管道将它连接到一个简单的shell脚本,即 ps aux|awk {'print $1,$2,$3,$11'} | ./myscript 其中,我的脚本的内容是: #!/bin/bash # testing using positional para
ps aux|awk {'print $1,$2,$3,$11'}
我得到了用户、PID、CPU%和实际命令的列表。
我想将所有这些列表导入一个shell脚本来计算CPU%,如果CPU%大于,比如5,则通过PID终止进程
我试着用管道将它连接到一个简单的shell脚本,即
ps aux|awk {'print $1,$2,$3,$11'} | ./myscript
其中,我的脚本的内容是:
#!/bin/bash
# testing using positional parameters
echo "$1 $2 $3 $4"
但我得到一个空白输出。你知道怎么做吗
非常感谢 脚本需要读取其输入
#!/bin/bash
while read a b c d; do
echo $a $b
done
我认为可以使用
xargs
命令将AWK输出作为参数传递给脚本:
ps aux|awk {'print $1,$2,$3,$11'} | xargs ./myscript
关于xargs的一些额外信息:在Linux(或兼容POSIX的系统)中,将输入从一个进程传输到另一个进程时,输出不会作为参数提供给接收进程。相反,第一个进程的标准输出通过管道传输到另一个进程的标准输入
因此,您的脚本无法工作$1…$n访问作为参数传递给它的变量。因为没有,所以它不会显示任何内容。相反,您必须使用
read
命令将标准输入读取到变量中(正如William所指出的)。管道“|”将左侧的标准输出重定向到右侧的标准输入。在这种情况下,ps的输出转到awk的输入,然后awk的输出转到脚本的stdin。
因此,您的脚本需要读取其STDIN
#!/bin/bash
read var1 var2 var3 ...
然后你可以用这些变量做任何你想做的事情
更多信息,请键入bash:help read如果我很了解您的问题,您希望杀死每个超过X%CPU的进程(使用
ps aux
)
以下是使用AWK的解决方案:
ps aux | grep -v "%CPU" | awk '{if ($3 > XXX) { print "Killing process with PID "$2", called "$4", consuming "$3"% and launched by "$1; system( "kill -9 " $2 );}}' -
其中XXX是您的阈值(CPU的百分比)
它还打印与终止进程相关的信息,如果不需要,只需删除print语句即可。
您可以添加一些过滤器,如:不删除root进程…如果使用
awk
,则不需要额外的bash脚本。另外,最好减少ps
命令的输出,这样就不必处理额外的信息:
ps acxho user,pid,%cpu,cmd | awk '$3 > 5 {system("echo kill " $2)}'
解释
- 我使用的额外ps标志:
- c:仅限命令,无额外参数
- h:没有标题,适合编写脚本
- 输出格式。在这种情况下,只输出用户、PID、%CPU和命令
- awk命令将第三列%CPU与阈值(5)进行比较。如果超过阈值,则发出系统命令以终止该进程李>
- 注意命令中的回声。一旦确定脚本按您喜欢的方式工作,那么就从命令中删除echo这个词以真正执行它
./myscript `ps aux|awk {'print $1,$2,$3,$11'}`
好酷,这管用!以及有关“读取”命令的提示。但是,我只从ps aux获得第一行,即:USER PID%CPU命令。如何将ps aux | awk{'print$1、$2、$3、$11}的所有输出输入到脚本中?谢谢如果我是你,我会在AWK脚本中迭代这些行(对它们的值求和),这会更容易。如果您需要帮助,请告诉我。下面是一个使用AWK获取CPU总消耗百分比的示例:
ps aux|grep-v“%CPU”| AWK”BEGIN{CPU=0.0;}{CPU=CPU+$3;}END{print“CPU:%CPU”;}-
Hi Arutaku,感谢您的示例。我想做的是找到一个进程的PID,其中%CPU高于某个阈值,例如%CPU>5是否可以使用AWK脚本?我刚刚发布了一个新的答案,试图使用AWKThanks William解决您的问题,这很有效。但它只读取ps命令的第一行,即用户PID%CPU命令。脚本如何读取ps的全部内容?哇。。。那太好了!非常感谢你!现在我只需要学习一些AWK来理解这些神秘的命令:)有什么好的AWK初学者教程的建议吗?再次感谢!欢迎AWK在这方面非常强大。也许你可以试试:祝你好运!!再次感谢!非常感谢你的帮助!