脚本内容如下: 目的是监测mongo的连接数 达到一定的连接数后,重启。
#!/bin/bash
#source /etc/profile
conn=`/usr/bin/mongo --quiet << EOF
db.serverStatus().connections
exit
EOF
`
conn1=${conn#*:}
curr=${conn1%,*}
#PID=$(ps -ef|grep "mongodb"|grep -v grep|awk '{print $2}')
echo "$curr"
if [ $curr -le 5800 ]
then
echo "it's ok "
else
echo "the connect count is too big,it will be restart"
for PID in $(ps -ef|grep "maxConns"|grep -v grep|awk '{print $2}')
do
echo "$PID"
kill -9 $PID
done
echo "the process is killed"
nohup numactl --interleave=all /usr/local/mongodb/bin/mongod --dbpath=/home/mongo/mongodb/data/ --log
path=/home/mongo/mongodb/logs/mongodb.log --maxConns=6000 --logappend &>/dev/null &
echo "restart ok"
fi
遇到问题1 :conn=`/usr/bin/mongo --quiet << EOF 就是这一句, 在bash 中引用命令结果 一般用 ``或是$()
这句中以为增加了EOF 情况变的不一样了,刚开始我把`或) 放到 结束的EOF后面,总是提示语法错误 。
于是另起一行 `或 ) 则成功了
遇到问题2:命令脚本 手动执行没有问题 放到crontab里 就不能生效执行。
在网上查了写资料,有说可能是环境变量的影响,于是加了source /etc/profile 也加过source ~/.bash_profile
可是都没生效。 因为在创建crontab的时候增加了重定向日志 ,观察了日志下日志 发现总是卡在 输出it will be restart
在用ps查看进程 发现进程没有了 但是没有重启mongo。刚开始以为是在bash 中用nohup & 的原因 导致脚本会一直
停留在那个地方,但是怎么改也故障依旧。 于是我在kill -9 $PID之前 加了echo 显示pid ,发现pid 会有不止一个
于是加了个for循环 。后来发现不对啊 kill -9 后是可以加多个pid的吧。 所以也就没有动。之后在kill -9 语句又加了个echo
"the process is killed" 这就一直都不能呈现在日志里。 我开始知道是怎么回事了,为什么会有多个pid ,为什么mongo进程会
被kill ,为什么 kill后的echo 不输出了 。 原因是在crontab 中 kill 把进程本身也给杀掉了。crontab会产生子shell进程,当用awk过滤的时候
因为包含了mongo字样 所以也给过滤出来 这就是为什么会有多个pid。 kill的时候也就会杀掉了 ,所以kill后的echo 不显示。
于是我换了个过滤条件 用maxConns 解决!
阅读(16686) | 评论(0) | 转发(1) |