因爲分佈式系統的流行,服務器上面部署的項目都是多實例的。而我又但願有一個功能,當服務器出現異常狀況可以自動重啓實例。linux
因此我想到了使用shell腳本監控實例進程id,若是不存在的話,就重啓對應的實例。shell
1、輪詢監控實現:服務器
1. 使用crontab,缺點一分鐘輪詢一次app
2. 使用shell死循環進行輪詢分佈式
參考:https://blog.csdn.net/u011261430/article/details/72921991spa
因爲咱們系統使用人數比較少,因此我選擇crontab進行輪詢.net
2、環境變量問題:rest
crontab中的環境變量默認不會將咱們自行定義的環境變量載入進來,因此執行腳本的時候,須要執行source命令日誌
source /etc/profile
3、日誌輸出code
對於輪詢失敗的次數和時間須要進行統計,保證可以查詢到,因此咱們要將日誌重定向到一個固定的目錄,定時清理
*/1 * * * * /app/crontab/monitor.sh >> /app/crontab/kafka.log
4、代碼實例:
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
5、其餘
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字節)
路徑問題:最好腳本中都使用全路徑,避免路徑引起的問題。