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放在前面,如下所示:

./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在这方面非常强大。也许你可以试试:祝你好运!!再次感谢!非常感谢你的帮助!