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