之前筆者是在本地寫的部落格,然後用 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 表示錯誤輸出等同於標準輸出,標準輸出已重定向到空裝置,所以錯誤輸出也重定向到空裝置,不輸出