例行性工作排程 crontab

2023/11/19 Linux

前言

在 Linux 中,cron 是一個用於定期執行任務的工具。這些定期執行的任務可以是腳本、命令、或者其他可以在終端中執行的操作。cron 工具的主要組件是 cron 和 crontab。

  • cron: 是一個在後台運行的守護程序,它負責執行預定的任務。這些任務被保存在 cron 列表中。
  • crontab: 是用於設置和管理cron列表的命令。每個用戶都可以擁有自己的cron表,而且系統也有一個全域的cron表。

常見的 crontab 命令:

  • crontab -e: 編輯使用者的cron列表。如果沒有指定使用者,則預設是當前使用者。
crontab -e
  • crontab -l: 列出的cron列表所有事件。
crontab -l
  • crontab -r: 刪除cron列表所有事件。
crontab -r

cron 結構

星號(*)表示”每”,因此 * * * * * 表示每分鐘都執行一次。你可以使用具體的數字,例如 30 1 * * * 表示每天的1:30執行。

* * * * * command_to_be_executed
- - - - -
| | | | |
| | | | +----- 執行命令的星期幾 (0 - 7) (星期天是 0 或 7)
| | | +------- 執行命令的月份 (1 - 12)
| | +--------- 執行命令的日期 (1 - 31)
| +----------- 執行命令的小時 (0 - 23)
+------------- 執行命令的分鐘 (0 - 59)

以下是一些例子:

  • 每天半夜執行:
    0 0 * * * command_to_be_executed
    
  • 每週一的上午9點30分執行:
    30 9 * * 1 command_to_be_executed
    
  • 每隔10分鐘執行:
    */10 * * * * command_to_be_executed
    

cron 還可以透過其他方式更複雜的設置,例如使用 @reboot 來在系統啟動時執行,或者使用@daily@weekly 等預定義的時間。cron 是一個強大的任務調度工具,能夠自動執行各種任務,提高系統的自動化和效率。

設定 crontab 例行性工作排程

cron 是一個強大的任務調度工具,它允許使用者根據自己的需求指定定時執行的頻率。使用者只需將指令或程式的執行時間設定在 crontab 設定檔中,不必手動執行這些工作。這樣一來,系統就能夠在背後按照預定的時間表執行這些工作,使得定期性的任務得以自動化,提高了系統的效率和管理的方便性。

若要編輯自己的 crontab 內容可以直接輸入 crontab -e 進入終端畫面直接輸入執行指令。又或者是在任一資料夾建立一個 myjob(檔名任意)。然後輸入欲執行的時間與腳本。這兩行是用來設定 cron 任務的表達式。在 cron 表達式中,分別用來指定分、時、日、月、星期的時間。接著是執行帳號,表示該任務由哪個用戶執行。最後是指令,表示要執行的命令或腳本。

  • 第一行的 cron 表示每分鐘執行一次。它的作用是將 “hello” 寫入 /tmp/crontab.log 文件,每分鐘執行一次。
  • 第二行的 cron 也表示每分鐘執行一次。它的作用是執行 /tmp/script.sh 腳本,並將標準輸出(stdout)寫入 /tmp/stdout.log 文件,將標準錯誤輸出(stderr)寫入 /tmp/stderr.log 文件。這樣設定的目的是記錄腳本的執行日誌,方便後續追蹤和除錯。
# 分 時 日 月 星期 執行帳號 指令...
* * * * * echo "hello" >> "/tmp/crontab.log"
*/1 * * * * sh /tmp/script.sh >/tmp/stdout.log 2>/tmp/stderr.log

記得多留一個換行。

接著輸入以下指令將寫好的排程啟動,它的作用是將 myjob 這個文件安裝為你的 cron 任務表。具體來說,myjob 文件應該包含一個或多個 cron 表達式以及相應的要執行的命令或腳本。

crontab myjob

另外記得在 /tmp 底下新增 script.sh。這是一個 bash 腳本,這個腳本的目的是在 /tmp/hello.txt 文件中寫入包含日期時間前綴的 “hello” 訊息,同時在終端上顯示腳本啟動的時間。這樣的腳本可能被用於執行一些需要時間戳的工作,或者用於紀錄腳本的執行狀態。

#!/bin/bash
echo "Starting script $(date)"
echo "$(date): hello" >> /tmp/hello.txt

注意第一行的 Starting script $(date) 會被寫到 tmp/stdout.log

第二行的 $(date): hello 會另外被寫檔到 /tmp/hello.txt

後記

在 Docker 中必續執行 CMD cron 啟動排程。也可以透過以下指令查看是否 cron 被正確運行在背景。

ps -ef | grep cron

若要停止 cron:

/etc/init.d/cron stop

範例程式碼:https://github.com/1010code/crontab-tutorial

鼓勵持續創作,支持化讚為賞!透過下方的 Like 拍手👏,讓創作者獲得額外收入~
版主10在2020年首次開設YouTube頻道,嘗試拍攝程式教學。想要了解更多的朋友歡迎關注我的頻道,您的訂閱就是最大的支持~如果想學其他什麼內容也歡迎許願XD
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A

Search

    Table of Contents