Linux之for迴圈程序終止的方法

2021-08-16 05:45:12 字數 1859 閱讀 7060

需求是這樣:

#!/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終端...