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