【小技巧】Shell批量處理報錯資訊,檢測本地jar包是否存在
阿新 • • 發佈:2021-01-18
【小技巧】Shell批量處理報錯資訊,檢測本地jar包是否存在
最近在搭建LLAP時,遇到一些問題,直接丟擲一堆錯誤,提示Jar不存在。
Caused by: java.io.FileNotFoundException: File /opt/app/hadoop-2.7.7/share/hadoop/common/hadoop-lzo-0.4.20.jar:/opt/app/apache-tez-0.9.1-bin/hadoop-shim-0.9.1.jar:/opt/app/apache-tez-0.9.1-bin/hadoop-shim-2.7-0.9.1.jar:/opt/app/apache-tez-0.9.1-bin/tez-api-0.9.1.jar:/opt/app/apache-tez-0.9.1-bin/tez-common-0.9.1.jar:/opt/app/apache-tez-0.9.1-bin/tez-dag-0.9.1.jar does not exist
丟擲了一堆使用冒號分割的jar包字串。當然實際報錯的jar包數量更多,這裡截取了一部分。
雖然後來發現問題不是jar包缺失,而且配置問題。但當時拿到這個錯誤時,第一反應是這些jar缺失了,手動去目錄中進行核對排查。
排查了一個之後,發現jar包存在。可能是其中的某個jar出現了缺失。
但全部手動排查,工作量太大。於是想到了使用指令碼批量排查。
指令碼的製作思路,就是先將這一大段jar包字串作為引數傳遞進去,然後shell按照冒號" : "進行分割,然後對每個jar使用ls
進行檢視,如果缺失,則輸出提示。
於是,最終shell指令碼編寫如下:
#! /bin/bash
content= $1
#遍歷字串
OLD_IFS="$IFS" #儲存舊的分隔符
IFS=":"
nodes=($content)
IFS="$OLD_IFS" # 將IFS恢復成原來的
for i in "${!nodes[@]}"; do
info=`ls ${nodes[i]}`
if [ -z "$info" ]; then
echo "${nodes[i]}"
fi
done
這裡主要涉及到對字串的切分,儲存為陣列後,再對資料進行遍歷。如果遇到不存在的jar包,則將jar字串資訊輸出。
後話
如果有幫助的,記得點贊、關注。在公眾號《數舟》中,可以免費獲取專欄《資料倉庫》配套的視訊課程、大資料叢集自動安裝指令碼,並獲取進群交流的途徑。
我所有的大資料技術內容也會優先發布到公眾號中。如果對某些大資料技術有興趣,但沒有充足的時間,在群裡提出,我為大家安排分享。
公眾號自取: