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目录下:
#!/bin/bash
#/usr/local/ngrok/bin/ngrokd -domain=xiejl.com -httpAddr=:80 &> /dev/null &
param=" &> /dev/null &"
memsize=`ps -aux | grep "/usr/local/ngrok/bin/ngrokd" | grep -v grep | awk '{printf $6 }'`
echo $memsize
if [[ $memsize -gt 10000 ]]; then
echo "restart begin"
ngrok_restart=`ps -aux | grep "/usr/local/ngrok/bin/ngrokd" | grep -v grep | awk '{for(i=11;i<=NF;i++)printf $i " "}'`
echo $ngrok_restart
pkill -f
/usr/local/ngrok/bin/ngrokdeval "$ngrok_restart $param"
echo "restart over"
elif [ -z $memsize ]; then
echo "start begin"
eval "/usr/local/ngrok/bin/ngrokd -domain=xiejl.com -httpAddr=:80 $param"
echo "start over"
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列到后面的内容全部截取出来.
加入定时任务,定时重启程序:
查看时间和时区:
date -R
如果结果后面不是 +0800,那就不是东八区,不是中国时间.
可以修改为中国时间:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
再次查看时间,看是否变回来了.
加入定时任务,凌晨4点重启:
crontab -e
添加:
0 4 * * * /usr/local/sbin/restart-ngrokd.sh
以后每天凌晨4点程序自动重启,不用担心程序会导致系统宕机了.