由於分布式系統的流行,服務器上面部署的項目都是多實例的。而我又希望有一個功能,當服務器出現異常情況能夠自動重啟實例。
所以我想到了使用shell腳本監控實例進程id,如果不存在的話,就重啟對應的實例。
一、輪詢監控實現:
1. 使用crontab,缺點一分鍾輪詢一次
2. 使用shell死循環進行輪詢
參考:https://blog.csdn.net/u011261430/article/details/72921991
由於我們系統使用人數比較少,所以我選擇crontab進行輪詢
二、環境變量問題:
crontab中的環境變量默認不會將我們自行定義的環境變量載入進來,所以執行腳本的時候,需要執行source命令
source /etc/profile
三、日志輸出
對於輪詢失敗的次數和時間需要進行統計,保證能夠查詢到,所以我們要將日志重定向到一個固定的目錄,定時清理
*/1 * * * * /app/crontab/monitor.sh >> /app/crontab/kafka.log
四、代碼實例:
crontab -e:將對應日志寫入到文件中,方便后期查詢失敗的情況
*/1 * * * * /app/crontab/monitor.sh >> /app/crontab/kafka.log
文件目錄結構:
├── app │ ├── crontab │ ├── kafka.log │ ├── monitor.sh
monitor.sh
記得必須先賦權
chmod 777 monitor.sh
具體代碼
#!/bin/sh
# 默認shell執行需要的內容
# 環境變量重新生效 source /etc/profile
# 判斷進程是否存在,記得使用grep -v 排除gerp進程 retDesc=`ps -ef | grep "kafka.Kafka /app/kafka/config/server.properties" | grep -v grep` retCode=$? # 判斷是否不為0,不為0就重新啟動服務器,為0就說明服務器存在
if [ ${retCode} -ne 0 ]; then # invoke aliyun mobile push sms echo $(date +%F%n%T) echo "server down restart..." /app/kafka/bin/kafka-server-start.sh -daemon /app/kafka/config/server.properties >> /dev/null 2>&1 else echo "server on" fi
五、其他
linux中如果需要顯示樹形目錄結構,安裝tree庫即可
cron日志:tailf /var/log/cron
linux中的標准輸入和輸出,也就是控制台的輸入和輸出:https://blog.csdn.net/cjfeii/article/details/10084343
linux中有一個輸入時空設備/dev/null 輸出到這邊的東西是不會占用內存的 > 新文件 >> 附加 2>&1 程序輸出和錯誤輸出都走這個輸出
賦權命令:chmod 777 *.sh
linux快熟清空文件的三種方法:
echo "" > test.txt(文件大小被截為1字節) > test.txt(文件大小被截為0字節) cat/dev/null > test.txt(文件大小被截為0字節)
路徑問題:最好腳本中都使用全路徑,避免路徑引發的問題。