天天看點

java調用shell擷取錯誤資訊_一起學習Shell腳本

java調用shell擷取錯誤資訊_一起學習Shell腳本

 什麼是shell腳本? 

  腳本最初是從演藝界中的一個詞,指表演戲劇、拍攝電影等所依據的底本或者書稿的底本。後來,IT行業引用了這個詞,我們現在所說的腳本(script)是使用一種特定的描述性語言,依據一定的格式編寫的可執行檔案,又稱作宏或批處理檔案。腳本通常可以由應用程式臨時調用并執行。shell腳本就是腳本語言中的一種。它不是一門正式的程式設計語言,因為跑在Linux的shell中,是以就稱它為shell腳本。說白了,shell腳本就是一些指令的集合。我們可以利用shell腳本将很多個操作指令記錄到一個文檔中,然後調用文檔中的指令,一次完成所有指令的操作。例如在hadoop中我們啟動叢集常用到start-all.sh來啟動叢集中的多個服務。這個start-all.sh就是一個shell腳本,我們今天就來看看start-all是怎樣啟動叢集的。 學習之前,我們要指定兩項規定:

  • 我們的自定義腳本建議都放在/user/local/sbin/目錄下邊,這樣做是為了以後更好管理文檔,也讓以後接管你工作的同僚知道腳本放在哪裡。
  • 我們的shell腳本檔案要将其設定為.sh檔案。這樣做的目的是為了讓别人一看就知道這是一個shell腳本。

下面我們就來寫一個Hello World的shell腳本:

  • 建立一個檔案:
  • 編寫shell腳本

輸出結果為: hello World 腳本解析:

  • 第一行中的#是一個約定标記,他告訴系統這個腳本需要什麼解釋器來執行,後面的/bin/bash就是指明了解釋器的具體位置。
  • 第二行echo指令用于向标準輸出檔案(Standard Output,stdout,一般就是指顯示器)輸出文本。在.sh檔案中使用指令與在終端直接輸入指令的效果是一樣的。
  • 第二行的#及其後面的内容是注釋。(shell中除了開頭的#!不是注釋,其他的#都是注釋)

後續文檔參考指令符解釋:

$        #$加變量名代表引用這個變量$0        #Shell本身的檔案名$1~$n    #添加到Shell的各參數值。$1是第1參數、$2是第2參數…。$#       #是傳給腳本的參數個數.        #如果使用” . "執行,則程式繼承目前shell中的環境變量,同時,若在程式中改變了目前shell中的環境變量,則目前shell中該環境變量的值也會改變另外一個差別點在于, “ ./ "隻能用于擁有執行權限的檔案, 而 ” . " 則可以暫時提升執行權限if    ***    fi        #判斷語句類似于Java中if{}-f        #判斷給定的是不是檔案case   ***    in    ***   esac    #類似java中的caseshift    #指令表示參數向左偏移,後面可跟數字(數字大小在參數個數範圍内)
           

下面我們再來寫一個稍微複雜一點的腳本: 腳本解析: 第一行是指定我們的解釋器,并指明了解釋器的具體位置。 第二行相當于我們将檔案目錄的字元串指派給了bin變量,${BASH_SOURCE-$0}這一串是為了擷取目前執行的腳本檔案的全路徑,于是我們的bin就得到了腳本檔案的全路徑。 第三行我們首先執行了cd "$bin"($加上變量名可以用來引用這個變量),進入了腳本的目錄環境,然後又輸出了目前目錄,并把這個目錄給了bin變量。執行完這行之後我們就進入了腳本檔案目錄環境。并且bin值成為了目前腳本的所在檔案。 第四行中我們擷取絕對路徑以備後用:

${HADOOP_HOME}/libexec
           

第五行為HADOOP_LIBEXEC_DIR變量三元指派。如果HADOOP_LIBEXEC_DIR為空或者環境變量沒有配置,就指派預設的絕對路徑,為下一步執行該目錄下面的腳本做準備。

   第六行執行下面腳本。為後面執行啟動各節點和啟動YARN做預處理: 另外要提的是:

如果使用" ./ " 執行,可以了解為程式運作在一個全新的shell中不繼承目前shell的環境變量的值同時若在程式中改變了目前shell中的環境變量(不使用export)則目前shell的環境變量值不變。如果使用" . "執行,則程式繼承目前shell中的環境變量同時,若在程式中改變了目前shell中的環境變量則目前shell中該環境變量的值也會改變另外一個差別點在于" ./ "隻能用于擁有執行權限的檔案而 " . "則可以暫時提升執行權限。
           

第七行執行啟動腳本,if是判斷語句(類似于Java)fi是if的字母倒序,表示if判斷語句結束;-f 做判斷是不是檔案類型。這段腳本的意圖是: 如果${HADOOP_HDFS_HOME}/sbin/start-dfs.sh為檔案,則聯合--config參數及其後面的參數值執行start-dfs.sh。start-dfs.sh後面做詳細分析。 第八行執行YRAN排程服務,這段腳本的意圖是: 如果${HADOOP_HDFS_HOME}/sbin/start-yarn.sh為檔案,則聯合--config參數及其後面的參數值執行start-yarn.sh。start-yarn.sh後面做詳細分析。 這就是完整的start-all.sh的shell執行流程。其中涉及到的start-yarn.sh和start-dfs.sh腳本,兩個腳本十分類似,我們再看看start-dfs.sh腳本。

#!/usr/bin/env bash# Start hadoop dfs daemons.  # Optinally upgrade or rollback dfs state.  # Run this on master node.    usage="Usage: start-dfs.sh [-upgrade|-rollback]"  #定義usage變量,即start-dfs.sh的使用說明,在後面的内容可以看到,當參數輸入錯誤時,會列印該消息  bin=`dirname "$0"`  bin=`cd "$bin"; pwd`    . "$bin"/hadoop-config.sh    # get arguments  if [ $# -ge 1 ]; then      nameStartOpt=$1      shift      case $nameStartOpt in        (-upgrade)          ;;        (-rollback)           dataStartOpt=$nameStartOpt          ;;        (*)            echo $usage            exit 1          ;;      esac  fi    # start dfs daemons  # start namenode after datanodes, to minimize time namenode is up w/o data  # note: datanodes will log connection errors until namenode starts  "$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode $nameStartOpt  "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start datanode $dataStartOpt  "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR --hosts masters start secondarynamenode
           

     前面的代碼我們上面已經解釋過,不再贅述,要提的是,$0是指shell本身的檔案名,其他的類似。後面的完整的判斷語句的意思是:如果參數值的個數大于等于1的時候(代表還有服務需要開啟),如果參數是upgrade,則設定nameStartOpt變量以備後用;如果是rollback,則設定dataStartOpt變量以備後用。 後面的腳本分别則是用來啟動NameNode、DataNode、Master。

java調用shell擷取錯誤資訊_一起學習Shell腳本

繼續閱讀