需求是這樣:
#!/usr/bin/bash
day=0
tmpday=0
tmp2=0
#for迴圈執行程序,省的乙個個手動跑
for((day=1;day<=59;day++))
doif
[[ $day -lt 10 ]]; then
tmpday=2018010$
elif [[ $day -le 31 ]]; then
tmpday=201801$
elif [[ $day -lt 41 ]]; then
tmp2=`expr $day - 31`
tmpday=2018020$
else
tmp2=`expr $day - 31`
tmpday=201802$
fiecho $;
/usr/local/hadoop/bin/hadoop jar /home/workspace/xm-bin.jar com.xm.hadoop.main \
-drp.input.data1=/input/data1/$-data1.txt \
-drp.input.data2=/input/data2/ \
-drp.output.path=/output/marathon/$
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.pid
23452
[root@namenode xm]# kill 26398
3、123.sh指令碼雖然被kill了,但是已經在執行的hadoop作業卻依然在跑,如果該作業有很多job,那麼它就會跑完所有job才會停止,所以需要kill掉正在跑的job,這樣才會完全終止
hadoop job -kill job_123456789434_1234
Linux 程序建立 程序終止
程序終止 fork 在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1子程序複製父程序的pcb,因此複製了父程序的程式計數器,所以和父...
Linux程序終止訊號
sigterm 該訊號可由程序捕獲,使用該訊號讓程序有機會在退出之前做好清理工作,從而優雅地終止。sigint 當使用者按下中斷鍵 一般採用delete或ctrl c 時,終端驅動程式產生此訊號並傳送至前台程序組中的每乙個程序。sigkill 該訊號不能被程序捕捉和忽略,它向系統管理員提供了一種可靠...
終止前台程序 linux 程序管理
ps precess sstatus 程序狀態 ps aux a 顯示現行終端下所有程式 u 以使用者為主來顯示程式執行狀態 x 不宜終端機來區分 user 使用者名稱pid 執行id cpu 占用cpu百分比 mem 占用記憶體百分比 vsz占用虛擬記憶體大小 rss占用實際記憶體大小 tty終端...