Elasticsearch 自動重啓腳本,一樣適用於其餘應用

應產品要求,讓寫個es的自動重啓的腳本,若是es掛了,要在分分鐘以內重啓,當時個人心裏是崩潰的,像我這種Linux只會cdls 的哪會寫什麼腳本啊,無奈,只能去谷歌了,邊看邊改,沒想到還真給寫出來了,貌似還不難,是否是有什麼漏洞我就母雞了。java

es自動重啓,首先要知道es是怎麼啓的,下載,配置,啓動,這裏就略過了。直接看腳本吧。shell

建立腳本

首先建立個sh文件,es_monitor.sh,內容很簡單,判斷es進程是否存在,存在就算了,不存在就重啓。bash

#!/bin/bash
cd `dirname $0`
BIN_DIR=`pwd`
# jdk路徑,這裏有個坑,下文會講
export JAVA_HOME=/home/pangu/soft/jdk1.8.0_111
# 獲取es進程ID,個人es目錄是/home/pangu/app/elastic/elasticsearch-master
ES_ID=`ps -ef |grep elasticsearch |grep -w 'elasticsearch-master'|grep -v 'grep'|awk '{print $2}'`
#啓動腳本目錄
StartES=/home/pangu/app/elastic/elasticsearch-master/bin/elasticsearch
# 日誌輸出
ESMonitorLog=$BIN_DIR/es-master-monitor.log

Monitor()
{
  if [[ $ES_ID ]];then # 這裏判斷ES進程是否存在
    echo "[info]當前ES進程ID爲:$ES_ID"
  else
    echo "[error]ES進程不存在!ES開始自動重啓..."
    sh $StartES -d
  fi
}

Monitor>>$ESMonitorLog

crontab 定時任務

crond 是 Linux 下用來週期性的執行某種任務或等待處理某些事件的一個守護進程。app

當前用戶(pangu)下crontab -e,把下面這個放進去,保存,路徑是本身腳本的路徑,一分鐘檢測一次。ps: es默認不能用root啓動,這裏所說用戶都是pangu。elasticsearch

*/1 * * * * /bin/sh /home/pangu/app/elastic/es-monitor/es_monitor.sh

遇到的問題:

過程當中遇到了一個問題,./bin/elasticsearch -d直接啓動es是能夠的 ,直接運行es_monitor.sh 也是能夠的,若是es進程被殺死,是會啓動的,可是用crontab怎麼都不行,一直報 JAVA_HOME 找不到的問題。spa

Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME

而 pangu 用戶的.bash_profile裏面是配的有 Java環境變量的啊,想不通就去求助Linux大神旭哥了,旭哥看到後,表示很無語,罵了一句傻逼,說這都是最基礎的東西。原來我配置在 pangu 用戶下的.bash_profile Java環境變量在 cron 下是不生效的,去網上查了一下,發現好多人都被這個環境變量的問題坑過,crontab會以用戶的身份執行配置的命令,可是不會加載用戶的環境變量。這個能夠用交互、非交互shell來解釋,.bash_profile是交互的,以login的方式進入bash運行的。什麼是交互式模式呢?就是shell等待你的輸入,而且當即執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、簽退。當你簽退後,shell也終止了。而非交互式模式,是以shell script(非交互)方式執行的,在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,而且執行它們,當它讀到文件的結尾,shell也就終止了。可見咱們的crontab是非交互的模式。這樣就懂了吧,看來要好好學學Linux了,噗噗噗。日誌

相關文章
相關標籤/搜索