2015年5月10日 星期日

[cronjob] 排程注意事項 - 檢查前一次的排程工作是否已結束

最近在寫日常排程的Script,

注意到排程工作(cronjob) 如果要穩定執行不出問題,

有個特別要處理的細節,

    就是「每當排程一啟動時,如何判斷前一次排程工作是否還在執行」

如果前一次排程工作尚未做完,

一般來說我們會希望這次啟動的排程不做任何事就直接結束,

以避免同時有2個排程對同個檔案做處理 ,

執行結果彼此覆蓋,導致錯誤發生。

此外檢查前一次排程是否存在最大的優點在於

    我們不用假設排程工作完成所需要的時間,就算排程間的間格設定為1分鐘啟動一次, 也能很安全的執行,一次只會有一個排程執行。

判斷前一次排程工作是否還在執行

可以使用以下指令來判斷:

    $process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^$cmd" | wc -l`;

這邊的$cmd是我們要抓取的排程指令,

假設我們的排程是run.sh,

則上面的指令就改成:

$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^run.sh" | wc -l`;

第一眼看到會覺得很複雜,

沒關係,讓我們一步步拆解這條指令,

首先, 

ps aux 是用來取得目前所有執行的process,

執行結果如下圖:

接著 ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",$i OFS);} printf("%s", ORS);}'


你會發現輸出結果只剩下COMMAND這一欄了,

那這個awk是拿來幹嘛的勒,

awk是個字串處理的指令,

他會將一行字串根據空白或tab做切割,

並輸出第n格的字串,

例如: 

我們有一行字串是 "Jack    3345678   jack@domain.com"

此時awk會切割成3個字串,並存在一個陣列

    arr[0]="Jack    3345678   jack@domain.com"
    arr[1]="Jack"
    arr[2]="3345678"
    arr[3]="jack@domain.com"

有趣的地方是陣列的第0個是存放原始字串的內容,

切割的內容從1開始數,

如果只要輸出第1格和第2格的內容,

則寫成如下指令:

    echo "Jack    3345678   jack@domain.com" | awk '{printf("%s",$1 ORS $2 ORS);}'

這邊的$2用來指定第2格,ORS代表換行符號,OFS代表空白,


而 awk '{for(i=1;i<=2;i++) {printf("%s",$i OFS);} printf("%s", ORS);} 

是上述指令的進階版,

等同於awk '{printf("%s",$1 OFS $2 ORS);}'。

最後就是用egrep抓出我們要檢查的排程指令,

為何用egrep而不是grep,

原因在於grep會抓出所有包含run.sh的字串

因此以下字串都會被grep抓出來
    
    a_run.sh
    xx_run.sh

為了防止這種情況發生,

我們使用egrep搭配正則表達式(regular expression)抓出run.sh開頭的所有字串,

執行結果如下(抓出所有/usr/sbin開頭的process):

配合wc -l 指令,算出egrep的抓取結果有幾行,

以/usr/sbin為例,可以找到14個以/usr/sbin開頭的process,


以上是針對

$process_num = `ps aux | awk '{for(i=11;i<=NF;i++) {printf("%s",\$i OFS);} printf("%s", ORS);}' | egrep "^$cmd" | wc -l`;

的完整說明。

[結論]
(1)可以利用ps aux搭配awk, egrep, wc來抓出前一次排程是否執行完成。
(2)檢查前一次排程是否存在最大的優點在於
     - 我們不用假設排程工作完成所需要的時間,就算排程間的間格設定為1分鐘啟動
       一次,也能很安全的執行,一次只會有一個排程執行。





1 則留言:

  1. Bet365 Casino App and Casino Review - JtmHub
    Bet365 광주광역 출장안마 Casino Review for 전주 출장마사지 2021 | Check out our full 대전광역 출장샵 review of the welcome offer, game 시흥 출장안마 selection, bonus, mobile app, banking, and more. 삼척 출장샵 Rating: 4.3 · ‎Review by JT Hub

    回覆刪除