1. 程式人生 > 實用技巧 >shell程式設計實戰之記憶體檢查超過設定值殺死php-fpm程序

shell程式設計實戰之記憶體檢查超過設定值殺死php-fpm程序

首先,我們要獲取伺服器的記憶體使用率。通過free可以獲取總記憶體大小以及使用記憶體多少

[root@jackie ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1882000      728120      407880        4440      746000      980784
Swap:       1049596           0     1049596

我們需要的是Mem那行的,total以及used項。我們通過grep以及awk命令,可以獲得當前系統的記憶體使用率。

free |grep -i mem | awk '{n=$3/$2; printf("%.0f", n * 100)}'

獲得了記憶體使用率後,然後拿它和預設值作比較。當大於預設值時,就把系統中所以php-fpm程序殺死。那麼接下來的工作就是如何找出系統中所有php-fpm程序,以及如何去殺死這些程序。
想要獲取系統所有的php-fpm程序,可以使用ps命令,然後結合grep過濾即可。

 1 [root@jackie ~]# ps aux | grep php-fpm | grep -v grep | grep -v master
 2 www       1811  0.0  0.4 220504  8416
? S Jul25 0:00 php-fpm: pool www 3 www 1812 0.0 0.4 220504 8440 ? S Jul25 0:00 php-fpm: pool www 4 www 1813 0.0 0.4 220376 8432 ? S Jul25 0:00 php-fpm: pool www 5 www 1814 0.0 0.4 220508 8392 ? S Jul25 0:00 php-fpm: pool www 6 www 1815 0.0 0.4
220508 8412 ? S Jul25 0:00 php-fpm: pool www 7 www 2761 0.0 0.4 220376 8396 ? S Aug12 0:00 php-fpm: pool www 8 www 7448 0.0 0.4 220376 8412 ? S Jul31 0:00 php-fpm: pool www 9 www 16877 0.0 0.8 247856 16172 ? S 13:06 0:00 php-fpm: pool www 10 www 16878 0.0 0.8 247856 16176 ? S 13:06 0:00 php-fpm: pool www 11 www 16880 0.0 0.8 247856 16488 ? S 13:06 0:00 php-fpm: pool www 12 www 16881 0.0 0.8 247856 16488 ? S 13:06 0:00 php-fpm: pool www 13 www 16882 0.0 0.8 247856 16488 ? S 13:06 0:00 php-fpm: pool www 14 www 16884 0.0 0.8 247856 16176 ? S 13:06 0:00 php-fpm: pool www 15 www 16885 0.0 0.7 247856 14572 ? S 13:06 0:00 php-fpm: pool www 16 www 16886 0.0 0.7 247856 15052 ? S 13:06 0:00 php-fpm: pool www 17 www 16887 0.0 0.7 247856 15052 ? S 13:06 0:00 php-fpm: pool www 18 www 16888 0.0 0.8 247856 15240 ? S 13:06 0:00 php-fpm: pool www
......

通過上面的命令獲取到了所有php-fpm程序,然後我們遍歷這些資訊,通過kill 程序號,來殺死php-fpm程序。
下面給出完整的shell指令碼程式:

#!/bin/bash
# 記憶體檢查,超過70%,殺死所有php-fpm程序
MEM_LIM=70

used=$(free | grep -i mem | awk '{n=$3/$2;printf("%.0f", n*100)}')

if ((used > MEM_LIM));then
    pids=`ps aux | grep php-fpm | grep -v grep | grep -v master | awk '{print $2}'`
    for pid in $pids
    do
       kill -9 $pid
    done
fi

上述的指令碼是非常簡單了,清晰命令。

下面總結下該指令碼程式使用了哪些知識點:

  • free命令獲取記憶體使用率

  • ps命令獲取所有php-fpm程序

  • kill命令殺死程序

  • shell程式設計條件分支以及迴圈結構

連結:https://mp.weixin.qq.com/s/Tl6cZuVMBebPDA2U0zEj7A