需求是這樣:
#。/usr/bin/bashday=0tmpday=0tmp2=0#for迴圈執行進程,省的一個個手動跑for((day=1;day<=59;day++))do if [[ $day -lt 10 ]]; then tmpday=2018010${day} elif [[ $day -le 31 ]]; then tmpday=201801${day} elif [[ $day -lt 41 ]]; then tmp2=`expr $day - 31` tmpday=2018020${tmp2} else tmp2=`expr $day - 31` tmpday=201802${tmp2} fi echo ${tmpday}; /usr/local/hadoop/bin/hadoop jar /home/workspace/xm-bin.jar com.xm.hadoop.Main \-Drp.input.data1=/input/data1/${tmpday}-data1.txt \-Drp.input.data2=/input/data2/ \-Drp.output.path=/output/marathon/${tmpday}done
以上是一個shell指令碼的內容,名為123.sh,這個指令碼的目的是使用 Hadoop根據兩個輸入檔案計算出一個結果,由於希望跑59天,所以按照原來的想法是把這個指令碼跑59遍,每跑完一次改一下參數,後來瞭解到可以使用shell中的for迴圈,然後在for迴圈外面建立變數,此乃背景
問題是什麼呢
如果我跑完了一天發現原來寫的hadoop分析檔案(也就是xm-bin.jar)有問題,需要重跑,這個時候怎麼辦呢,最簡單粗暴的方法就是使用如下命令
hadoop job -kill job_123456789434_1234
但是如果for迴圈很多的話,比如100次,按照這個方法得執行100次這個命令,頭大
後來想到linux中殺進程的方法都是kill + 進程id
現在問題就轉變成如何擷取正在啟動並執行123.sh指令碼的進程id
ps -aux
進程太多,根本找不到
ps -aux|grep 123.sh 或者 ps -ef|grep 123.sh
後者可以查到父進程的id,不過執行kill 父進程id根本無效
即使加上訊號也沒用,就是下面這樣
kill -s 9 進程id
皇天不負苦心人,終於找到了答案,參考如何尋找SHELL的進程號,並殺死
具體步驟就是:
1、在123.sh中第一行添加如下代碼
echo "$$" > /tmp/xm_process.pid
這樣,該指令碼的id就會被寫到/tmp/xm_process.pid這個檔案中去
2、查看該進程id,並終止進程
[root@namenode xm]# cat /tmp/xm_process.pid23452[root@namenode xm]# kill 26398
3、123.sh指令碼雖然被kill了,但是已經在執行的hadoop作業卻依然在跑,如果該作業有很多job,那麼它就會跑完所有job才會停止,所以需要kill掉正在跑的job,這樣才會完全終止
hadoop job -kill job_123456789434_1234