程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 記一次bash shell編寫

記一次bash shell編寫

編輯:JAVA綜合教程

記一次bash shell編寫


腳本內容如下: 目的是監測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 解決!


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved