Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6266997
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2016-09-29 03:20:38

原文地址:记一次bash shell编写 作者:hot815

脚本内容如下: 目的是监测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  解决!


阅读(974) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~