首页 > 代码库 > CentOS7 定时检测进程占用内存大小,执行重启进程操作(xjl456852原创)

CentOS7 定时检测进程占用内存大小,执行重启进程操作(xjl456852原创)

在使用CentOS时,个别程序的进程会一直增大,直到宕机.但是这种程序本身有没有更好的版本使用(比如ngrok免费就这样,付费的就没这个问题),所以想写一个脚本定时检测一下这个程序的情况,决定是否需要重启,该重启时重启,没有启动则让他启动.

注:脚本名中最好不要包含ngrokd, 因为脚本执行时自己也会成为一个进程,获取原始ngrokd的进程大小就不能简写为grep "ngrokd"  ,而应改为全路径:grep "/usr/local/ngrok/bin/ngrokd", 而且pkill会把脚本本身结束掉, 但是为了更加通用以下按全路径写,不采用简写,脚本名可以随意写.

脚本作用:当ngrokd进程占用内存大于10000时,重启进程,如果没有这个进程,则启动进程.

ngrokd的程序在:/usr/local/ngrok/bin/ngrokd,可以根据自己情况进行修改

脚本名:restart-ngrokd.sh
脚本如下,将这个脚本放在/usr/local/sbin目录下:
  1. #!/bin/bash
  2. #/usr/local/ngrok/bin/ngrokd -domain=xiejl.com -httpAddr=:80 &> /dev/null &
  3. param=" &> /dev/null &"
  4. memsize=`ps -aux | grep "/usr/local/ngrok/bin/ngrokd" | grep -v grep | awk ‘{printf $6 }‘`
  5. echo $memsize
  6. if [[ $memsize -gt 10000 ]]; then
  7. echo "restart begin"
  8. ngrok_restart=`ps -aux | grep "/usr/local/ngrok/bin/ngrokd" | grep -v grep | awk ‘{for(i=11;i<=NF;i++)printf $i " "}‘`
  9. echo $ngrok_restart
  10. pkill -f /usr/local/ngrok/bin/ngrokd
  11. eval "$ngrok_restart $param"
  12. echo "restart over"
  13. elif [ -z $memsize ]; then
  14. echo "start begin"
  15. eval "/usr/local/ngrok/bin/ngrokd -domain=xiejl.com -httpAddr=:80 $param"
  16. echo "start over"
  17. fi
脚本解释:
param 变量是让ngrok这个程序后台执行的参数
memsize 变量是ngrok的内存占用大小
if [[ $memsize -gt 10000 ]]; then 这里不能写单中括号[ xxx ],加入$memsize是空的,写[ xxx ]会出错,所以用[[ xxx ]]
eval 是将命了和字符串参数拼接起来执行,当做一条命令执行.
pkill -f  进程全名. 结束匹配的全名,加入-f参数
awk ‘{for(i=11;i<=NF;i++)printf $i "  "}‘ 是将前面的结果中的第11列到后面的内容全部截取出来.

加入定时任务,定时重启程序:
查看时间和时区:
  1. date -R
如果结果后面不是 +0800,那就不是东八区,不是中国时间.
可以修改为中国时间:
  1. cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
再次查看时间,看是否变回来了.

加入定时任务,凌晨4点重启:
  1. crontab -e
添加:
  1. 0 4 * * * /usr/local/sbin/restart-ngrokd.sh

以后每天凌晨4点程序自动重启,不用担心程序会导致系统宕机了.

CentOS7 定时检测进程占用内存大小,执行重启进程操作(xjl456852原创)