问题:
后台运行一个shell程序,监控网络通讯RX或TX包在每秒100KB/s以上时,找到系统中CPU占有率最高的进程,并将其 杀死 。
思路
-
找到与RX,TX有关的参数,计算出RX,TX的速率(这里以RX为例,即当RX的速率超过100KB/s时)
RXpre=$(ifconfig ${eth}|grep bytes|grep RX|awk '{print $5;}')
该条指令找出当前RX速率,数据单位是 byte;
中间停歇1秒sleep 1
同样,一秒后RX的速率为
RXnext=$(ifconfig ${eth}|grep bytes|grep RX|awk '{print $5;}')
根据参数可以计算出,RX的速率(以KB/s为单位)
$(((${RXnext}-${RXpre})/1024))
-
当RX的速率 > 100KB/s时,找系统中CPU占有率最高的进程并将其杀死
按照CPU占有率对进程排序,并输出CPU占用率最高进程的信息,指令如下:ps aux|sort -rn -k+3|head -1
排序后,输出最高进程的PID
ps aux|sort -rn -k+3|head -1|cut -c 9-15
将CPU占有率最高的进程杀死
ps aux|sort -rn -k+3|head -1|cut -c 9-15|xargs kill -s 9
-
使用if 语句将前两步语句连接起来:
该部分的表达式如下:
if [ $(((${RXnext}-${RXpre})/1024)) -gt $a ]
then
ps aux|sort -rn -k+3|head -1|cut -c 9-15|xargs kill -s 9
fi
-
第四步,后台运行脚本,指令为正常运行指令加上&符号。
脚本代码:
#!/bin/bash
alias ifconfig="/sbin/ifconfig"
eth=enp0s3
a=100
while true;do
RXpre=$(ifconfig ${eth}|grep bytes|grep RX|awk '{print $5;}')
sleep 1
RXnext=$(ifconfig ${eth}|grep bytes|grep RX|awk '{print $5;}')
if [ $(((${RXnext}-${RXpre})/1024)) -gt $a ]
then
ps aux|sort -rn -k+3|head -1|cut -c 9-15|xargs kill -s 9
fi
done