At 、Crontabl定時任務

Howlet發表於2021-07-31

之前筆者是在本地寫的部落格,然後用 windows 定時任務啟動寫的指令碼上傳到 Github 上,現在又遇到了 Linux 上的定時任務,專案還要用到 Quartz 定時任務框架



1. 一次性定時任務 at

at 命令是用於一次的定時任務,使用起來十分簡便,而且定時的日期多樣化,注意其需要 atd 服務的支援



1.1 查詢 atd 是否啟動

一般系統(Linux)都自帶並自啟 atd,可用以下兩個命令查詢服務是否啟動

$ systemctl status atd
# Active: active (running)

$ ps -ef | grep atd
# root 1212 1 0 Jun14 ? 00:00:00 /usr/sbin/atd -f


1.2 at 命令格式

at 有兩種命令,格式如下:

# 第一種
$ at 時間
$ > 輸入要執行的內容
$ > EOF(Ctrl + D,表示輸入結束)

# 第二種
$ 將要執行的命令 |  at 時間

筆者下面使用第一種格式來演示命令的使用



1.3 at 命令引數

at 的命令引數也十分簡單,看看就會使用了

$ at  [引數]  [時間]

	-l:待執行的任務列表
	-d:刪除指定的待執行任務
	-m:任務執行完後向linux使用者傳送,即時沒標準輸出
	-f:指定包含具體指令的任務檔案
	-q:指定新任務的佇列名稱
	-c: 列印任務的內容到標準輸出

$ atq  待執行的任務列表(等價於 $ at -l)
$ atrm 刪除待執行的任務(等價於 $ at -d)


1.4 用例

$ date 檢視當前時間
# Sat Jul 31 13:38:35 CST 2021

$ at 13:40
$ > ls >> at.out
$ > EOF

# 然後就會在當前目錄下看到一個 at.out 檔案






2. 週期定時任務 crontab

crontab 命令被用來提交和管理使用者的需要週期性執行的任務,與windows下的計劃任務類似。系統會自動啟動 crond 程式每分鐘定期檢查是否有要執行的任務


使用crontab需要知道了解幾個概念:

  • crond:一個服務程式,每分鐘去檢查配置檔案是否有要執行的任務
  • 任務檔案:記錄了需要執行的任務
  • crontab:修改任務檔案的工具(即往配置檔案裡面增刪定時任務)



2.1 配置檔案


Linux下的任務排程分為:

  • 系統排程:系統週期性要執行的任務(寫快取到硬碟、日誌清理等,在/etc/crontab檔案中配置)
  • 使用者排程:使用者定期要執行的任務(資料備份、定時郵件等,在/var/spool/cron/使用者名稱為名的檔案中配置)

使用crontab命令的許可權:

  • /etc/cron.deny:該檔案中所列使用者不允許使用crontab命令
  • /etc/cron.allow:該檔案中所列使用者允許使用crontab命令

指令碼存放(我們還可以把指令碼放在下面,讓它每小時/天/星期/月執行一次):

  • /etc/cron.hourly
  • /etc/cron.daily
  • /etc/cron.weekly
  • /etc/cron.monthly


2.2 任務檔案的格式

在crontab任務檔案中,每一行代表一項任務。每行有六個欄位,分別是:

minute    hour    day    month    week    command

* * * * * command 每1分鐘執行一次command

3,15 * * * * command  每小時的第3和第15分鐘執行
  • * :每分,每時,每日的意思
  • , :用逗號隔開,例如"2,5"表示第2和第5,不包括第4、第3
  • - :用中槓隔開,例如"2-5"表示"2,3,4,5"
  • / :表示間隔頻率,例如 */2 ,是分為單位,則每2分鐘執行一次
  • % :在crontab檔案中表示換行,指令碼或命令中則要%來轉義


2.3 crontab 命令格式

$ crontab [選項] [引數]

	-e:直接編輯該使用者的計時器設定
	-l:列出該使用者的計時器設定
	-r:刪除該使用者的計時器設定
	-u<使用者名稱稱>:指定要設定計時器的使用者名稱稱


2.4 示例


2.4.1 示例1

$ vim
# !/bin/sh echo "cron test" test.sh

$ chmod +x test.sh

$ crontab -e
* * * * * /root/test.sh

# 每次執行會將控制檯輸出以郵件形式傳送到對應的使用者,用crontab -l可以檢視有沒有訊息,具體內容在
$ cat /var/spool/mail/root

2.4.2 示例2

# 表示輸入內容追加到log.txt中,而不是輸出到螢幕
# 2表示錯誤輸出也當成標準輸出
* * * * * /root/test.sh >/dev/null 2>&1(預設是1,可以不寫)
* * * * * /root/test.sh 1>/dev/null 2>&1
  • /dev/null:表示空裝置,就是忽略其輸出

  • 系統的3個預設I/O:

    • 0是標準輸入(鍵盤)
    • 1是標準輸出(螢幕),也是預設的
    • 2是標準錯誤
  • &:表示等同於,2>&1,表示2的輸出重定向等同於1,如果在控制檯除錯,也就是螢幕上,方便除錯

  • 1>/dev/null:表示標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端,說白了就是不顯示任何資訊

  • 2>&1 表示錯誤輸出等同於標準輸出,標準輸出已重定向到空裝置,所以錯誤輸出也重定向到空裝置,不輸出