2

当我运行这个命令时:

ps aux|awk {'print $1,$2,$3,$11'}

我得到了用户、PID、CPU% 和实际命令的列表。我想将所有这些列表通过管道传输到 shell 脚本中以计算 CPU%,如果大于 5,则通过 PID 终止进程。

我尝试将它传递给一个简单的shell脚本,即

ps aux|awk {'print $1,$2,$3,$11'} | ./myscript

我的脚本的内容是:

#!/bin/bash
# testing using positional parameters
echo "$1 $2 $3 $4" 

但我得到一个空白输出。知道怎么做吗?

非常感谢!

4

7 回答 7

5

如果使用awk,则不需要额外的 bash 脚本。此外,最好减少ps命令的输出,这样您就不必处理额外的信息:

ps acxho user,pid,%cpu,cmd | awk '$3 > 5 {system("echo kill " $2)}'

解释

  • 我使用的额外 ps 标志:
    • c: 只有命令,没有额外的参数
    • h:没有标题,适合编写脚本
    • o:输出格式。在这种情况下,只输出用户、PID、%CPU 和命令
  • awk 命令将第三列的 %CPU 与阈值 (5) 进行比较。如果超过阈值,则发出系统命令以终止该进程。
  • 注意命令中的回声。一旦您确定脚本以您喜欢的方式运行,然后从命令中删除单词echo以真正执行它。
于 2013-01-22T16:16:16.363 回答
3

您的脚本需要读取其输入

#!/bin/bash
while read a b c d; do
    echo $a $b
done
于 2013-01-22T14:28:41.050 回答
1

在 Linux(或 POSIX 兼容系统)中,当将输入从一个进程传递到另一个进程时,输出不会作为参数提供给接收进程。相反,第一个进程的标准输出通过管道传输到另一个进程的标准输入。

因此,您的脚本无法运行。$1...$n 访问作为参数传递给它的变量。因为没有,所以不会显示任何内容。相反,您必须使用命令将标准输入读入变量read(正如威廉指出的那样)。

于 2013-01-22T14:36:09.303 回答
1

尝试将 myscript 放在前面,如下所示:

./myscript `ps aux|awk {'print $1,$2,$3,$11'}`
于 2013-01-23T13:18:46.957 回答
1

我认为您可以使用xargs命令将 AWK 输出作为参数传递给您的脚本:

ps aux|awk {'print $1,$2,$3,$11'} | xargs ./myscript

一些额外的信息xargshttp ://en.wikipedia.org/wiki/Xargs

于 2013-01-22T14:31:54.340 回答
1

如果我很好地理解了您的问题,您想杀死超过 CPU 的 X% 的每个进程(使用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 的百分比)。

它还将相关信息打印到被杀死的进程,如果不需要,只需删除打印语句。您可以添加一些过滤器,例如:不要删除 root 的进程...

于 2013-01-22T15:34:02.893 回答
1

管道'|' 将左侧的标准输出重定向到右侧的标准输入。在这种情况下,ps 的输出进入 awk 的输入,然后 awk 的输出进入脚本的标准输入。因此,您的脚本需要阅读其 STDIN。

#!/bin/bash
read var1 var2 var3 ...

然后你可以对这些变量做任何你想做的事情。

更多信息,输入 bash: help read

于 2013-01-22T15:06:07.043 回答