2016-07-07 110 views
1

我想運行一個cron作業,它將執行我的shell腳本,我的shell腳本有配置文件&豬腳本。我將cron作業設置爲每2分鐘執行一次,但在我的shell腳本完成之前,我的cron作業再次啓動會影響我的結果,或者一旦腳本完成其執行,那麼只會啓動它。我在這裏有點困難。請幫忙。 感謝腳本沒有完成執行,但cron作業再次開始

+0

你希望你的cron作業只有在你先前執行完同一個腳本之後才能啓動? – Fazlin

+0

爲執行創建一個鎖定文件。根據您的要求,您可以簡單地忽略執行,如果以前尚未完成(我個人喜歡這個)或只是等待鎖被釋放。 – satish

+0

@Fazlin是的,我想流 – Ironman

回答

2

我認爲有兩種方式,以更好地解決這個問題,很長的路要走和一小段路:

  • 朗方式(可能是最正確的):

    使用類似Luigi管理工作的依賴性,然後用Cron運行它(它不會運行多個相同的工作)。

    Luigi會爲您處理所有的工作依賴關係,您可以確保某個工作只執行一次。這需要更多的工作來完成設置,但這確實是值得的。

  • 快捷途徑:

    鎖文件已經提到過,但你可以做到這一點對HDFS也這樣,它不依賴於您運行從cron作業。

    不是檢查鎖文件,把國旗HDFS當你開始和完成作業,並有本作中所有的cron作業的標準的事情:

    #在啓動

    Hadoop的FS -touchz /職位/ JOB1/2016年7月1日/ _STARTED

    #在最終

    Hadoop的FS -touchz /職位/ JOB1/2016年7月1日/ _COMPLETED

    #然後檢查它們(僞代碼):

    if(!started & &!completed:run_job; add_completed; remove_started

+0

只拋出一個與Luigi類似的稱爲「氣流」的選項。與Luigi或Airflow合作可能是更好和有效的方法。使用Airflow(Luigi也),您將工作(dag)標記爲取決於過去的完成情況。 – satish

+0

感謝您的幫助。我會兩種方式。 – Ironman

+0

@satish謝謝你的幫助。我討論「氣流」。 – Ironman

1

在腳本的開始,有一個檢查:

#!/bin/bash 
if [ -e /tmp/file.lock ]; then 
    rm /tmp/file.lock # removes the lock and continue 
else 
    exit # No lock file exists, which means prev execution has not completed. 
fi 

.... # Your script here 

touch /tmp/file.lock 

有殊途同歸的許多其他方面。我舉一個簡單的例子。

+0

file.lock中有什麼,在shell腳本中寫這個檢查的地方在哪裏? – Ironman

+0

file.lock是一個空文件,我使用'touch'在腳本的最後一行創建。我的例子中的'if'條件應該在實現之前首先執行。 – Fazlin

+0

我已編輯我的帖子。希望這有助於你的理解。 – Fazlin