僅在 Linux 中 Cron 作業未執行時執行 Cron 作業


介紹

Cron 是 Linux 中的一個實用程式,允許使用者計劃命令或指令碼在特定的日期和時間自動執行。但是,有時可能需要確保 cron 作業一次只執行一次。在本文中,我們將討論兩種防止 cron 任務重疊的方法:使用程序跟蹤和使用“.pid”檔案。

透過程序查詢正在執行的例項

避免 cron 任務執行重疊的一種方法是在執行它之前檢查任務程序是否存在。這可以使用pgrep命令完成,該命令允許我們搜尋具有特定名稱的程序並檢視其程序 ID。如果找到該程序,則表示該任務已在執行,並且不應該執行新例項。

要使用此方法,我們可以修改 cron 任務以在開頭包含以下命令:

if pgrep -x "script_name" > /dev/null ; then
   exit 0
fi

在上面的命令中,“script_name”是要作為 cron 作業執行的指令碼或命令的名稱。“-x”選項告訴pgrep匹配確切的程序名稱,“> /dev/null”部分將輸出重定向到空,以便它不會弄亂終端。如果指令碼已在執行,則 if 語句將為真,並且新例項將關閉而不會執行。

例如,如果我們有一個名為“my_script.sh”的指令碼,我們想將其作為 cron 作業執行,我們可以修改 cron 作業以包含以下命令:

if pgrep -x "my_script.sh" > /dev/null ; then
   exit 0
fi

這將在執行 cron 任務之前檢查“my_script.sh”程序是否存在。如果找到該程序,則新的任務例項將不會執行。

使用 .pid 檔案

避免 cron 任務執行重疊的另一種方法是使用“.pid”檔案。.pid 檔案是一個簡單的文字檔案,其中包含正在執行的程序的程序 ID。當任務執行時,它會建立一個“.pid”檔案,其中包含該任務的程序 ID。如果 .pid 檔案已存在,則表示該任務已在執行,並且不應該執行新例項。

要使用此方法,我們可以修改 cron 任務以在開始時包含以下命令:

pid_file="/path/to/pid/file/task.pid"
if [ -f "$pid_file" ] && kill -0 $(cat "$pid_file") 2>/dev/null; then
    exit 0
fi
echo $$ > "$pid_file"

在上面的命令中,“pid_file”是 .pid 檔案的路徑,它應該是執行 cron 任務的使用者可寫的路徑。if 語句首先檢查 .pid 檔案是否存在,然後使用 kill 命令向 .pid 檔案中包含的程序 ID 傳送訊號。“-0”選項告訴 kill 傳送空訊號,該訊號實際上不會殺死程序,但允許我們檢查程序是否仍在執行。如果程序仍在執行,則訊號將成功傳遞,並且 if 語句將為真,這將導致新例項退出而不會被執行。如果程序未執行,則訊號將不會傳遞,並且 if 語句將為假,允許任務執行。

if 語句的第二行“2>/dev/null”將所有錯誤訊息重定向到空,因此它們不會弄亂終端。

任務執行完成後,必須刪除 .pid 檔案以允許任務的未來例項執行。這可以使用以下命令完成:

$ rm "$pid_file"

例如,如果我們有一個名為“my_script.sh”的指令碼,我們想將其作為 cron 作業執行,並且我們想將 .pid 檔案儲存在“/tmp”目錄中,我們可以修改 cron 作業以包含以下命令:

pid_file="/tmp/my_script.pid"
if [ -f "$pid_file" ] && kill -0 $(cat "$pid_file") 2>/dev/null; then
   exit 0
fi
echo $$ > "$pid_file"

這將在“/tmp”目錄中建立一個名為“my_script.pid”的“.pid”檔案,並在其中儲存正在執行的任務的程序 ID。如果“.pid”檔案已存在,則表示該任務已在執行,並且新的例項將不會執行。任務執行完成後,“.pid”檔案將被刪除,從而允許任務的未來例項執行。

結論

在本文中,我們討論了兩種防止 cron 任務重疊執行的方法。第一種方法是使用程序發現來檢查活動程序是否存在,然後再執行活動,第二種方法是使用“.pid”檔案來儲存正在執行的活動程序 ID。這兩種方法都可以用於確保 cron 任務一次不會執行多次,這在任務資源密集型或需要一次只執行一次的情況下非常有用。需要注意的是,這兩種方法都需要更改任務指令碼本身,並且可能不適用於所有型別的任務。但是,它們可以是確保 cron 任務正確執行的有用工具。

更新於:2023年1月25日

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告