Linux定時執行
systemd.timer
精確到秒級的定時器任務。參考另一篇博文。
at命令
在指定時間執行一次性的任務或命令. at 不支持秒級精度
anacrontab命令
anacrontab 是一個專門用于處理那些由于系統關機而錯過的周期性任務的工具。它的主要目的是確保即使系統在預定的時間內未運行,任務也能在系統啟動后盡快執行。anacrontab 的時間精度較低,通常以天為單位進行調度。它不支持分鐘或小時級別的精確調度。
使用場景
- Crontab:適用于需要高精度調度的任務,如定期備份、日志輪轉、定時數據同步等。
- Anacrontab:適用于那些對時間精度要求不高,但必須保證任務最終執行的任務,如每日更新、每周報告生成等。
crontab命令
一、測試網站:
二、Details:
crontab配置文件
Linux下的任務調度分為兩類:系統任務調度和用戶任務調度。Linux系統任務是由 cron (crond) 這個系統服務來控制的,這個系統服務是默認啟動的。用戶自己設置的計劃任務則使用crontab 命令。在CentOS系統中,
cat /etc/crontab
配置文件可以看到如下解釋:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
前四行是用來配置crond任務運行的環境變量,
第一行SHELL變量指定了系統要使用哪個shell,這里是bash;
第二行PATH變量指定了系統執行命令的路徑;
第三行MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變量的值為空,則表示不發送任務執行信息給用戶;
第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。
用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致(可能需要root權限才能查看目錄)。
用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個字段代表一項設置,它的格式共分為六個字段,前五段是時間設定段,第六段是要執行的命令段,格式如下:
minute hour day month week command
在以上各個字段中,還可以使用以下特殊字符:
"*"代表所有的取值范圍內的數字,如月份字段為*,則表示1到12個月;
"/"代表每一定時間間隔的意思,但并不是通常意義上的時間間隔,而是一個周期內(對于分鐘,周期就是一小時)間隔,比如
- 分鐘字段為*/28(此時*實際等同于0),表示從第0分鐘開始每隔28分鐘執行一次,但是第56分鐘執行后會重新開始一個周期。執行時間為:第0分鐘,第28分鐘,第56分鐘,下一個周期的第0分鐘,第28分鐘,第56分鐘......
- 分鐘字段為 2/28,表示從第2分鐘開始每隔28分鐘執行一次。執行時間為:第2分鐘,第30分鐘,第58分鐘,下一個周期的第2分鐘,第30分鐘,第58分鐘......
- 假設秒字段為 *, 分鐘為 2/28, 則最終效果是 每秒執行一次。想實現每個周期內從第二分鐘開始,隔28分鐘執行一次的效果需要將秒字段設置一個數值
1 3 * * * ? // 此表達式是精確到秒的cron實現 (當前時間:2023年8月18日09:46:11) 2023-08-18 10:03:01 2023-08-18 11:03:01 2023-08-18 12:03:01 2023-08-18 13:03:01 7 2/28 * * * ? //此表達式是精確到秒的cron實現 2021-01-14 12:02:07 2021-01-14 12:30:07 2021-01-14 12:58:07 2021-01-14 13:02:07 2021-01-14 13:30:07 2021-01-14 13:58:07 //9點至晚上21點之間 每隔半小時運行一次 0 0/30 9-21 * * * // 此表達式是精確到秒的cron實現(當前時間:2023年8月23日08:45:34) 2023-08-23 09:00:00 2023-08-23 09:30:00 2023-08-23 10:00:00 2023-08-23 10:30:00 2023-08-23 11:00:00 2023-08-23 11:30:00 2023-08-23 12:00:00 2023-08-23 12:30:00 2023-08-23 13:00:00 2023-08-23 13:30:00* 2/28 * * * ? //精確到秒的cron實現的表達式 2021-01-14 11:30:00 2021-01-14 11:30:01 2021-01-14 11:30:02 2021-01-14 11:30:03 2021-01-14 11:30:04 2021-01-14 11:30:05
"-"代表從某個區間范圍,是閉區間。如“2-5”表示“2,3,4,5”,小時字段中0-23/2表示在0~23點范圍內每2個小時執行一次。
","分散的數字(不一定連續),如1,2,3,4,7,9。
"?"表示不關注這一項,如 幾號 和 星期幾,我只想在每月1號執行動作而不管是星期幾,那么就可以在星期幾的位置使用 "?"。有的 crontab實現 支持"?"有的不支持"?"
1 1 1 * ? //每月的1號1點1分執行動作,不管是星期幾。好像和 直接使用 * 效果一樣,不過有的實現不支持幾號 和 星期幾同時賦值,這時就用 “?”代替。
1 1 1 * 2 // 幾號和星期幾一起賦值時,取并集,即每月的1號1點1分 以及 每月的周二1點1分 執行動作
注:由于各個地方每周第一天不一樣,因此Sunday=0(第一天)或Sunday=7(最后1天)。
格式:
crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
- ? -u user:用于設定某個用戶的crontab服務;
- ? file: file為命令文件名,表示將file作為crontab的任務列表文件并載入crontab;
- ? -e:編輯某個用戶的crontab文件內容,如不指定用戶則表示當前用戶;
- ? -l:顯示某個用戶的crontab文件內容,如不指定用戶則表示當前用戶;
- ? -r:從/var/spool/cron目錄中刪除某個用戶的crontab文件。
- ? -i:在刪除用戶的crontab文件時給確認提示。
- crontab有2種編輯方式:直接編輯/etc/crontab文件與·crontab –e·,其中/etc/crontab里的計劃任務是系統中的計劃任務,而用戶的計劃任務需要通過crontab –e來編輯;
- `crontab -l`只能顯示用戶的計劃任務,無法顯示系統的計劃任務?。。?/li>
- 每次編輯完某個用戶的cron設置后,cron自動在/var/spool/cron下生成一個與此用戶同名的文件,此用戶的cron信息都記錄在這個文件中,這個文件是不可以直接編輯的,只可以用crontab -e 來編輯。
- crontab中的command盡量使用絕對路徑,否則會經常因為路徑錯誤導致任務無法執行。
- 新創建的cron job不會馬上執行,至少要等2分鐘才能執行,可重啟cron來立即執行。
- %在crontab文件中表示“換行”,因此假如腳本或命令含有%,需要使用\%來進行轉義。
- crontab最小執行周期是1min,如果需要小于1min,需要借助sleep N。參考此文。
- 有時我們創建了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由于在crontab文件中沒有配置環境變量引起的。
在 crontab文件中定義多個調度任務時,需要特別注意的一個問題就是環境變量的設置,因為我們手動執行某個任務時,是在當前shell環境下進行的,程 序當然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的,因此,就需要在crontab文件中指定任務運行所需的所有環境變量,這 樣,系統執行任務調度時就沒有問題了。可以嘗試在crontab中直接引入環境變量解決問題。如:·0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh·
每一分鐘執行一次command(因cron默認每1分鐘掃描一次,因此全為*即可)
* * * * * command
每小時的第3和第15分鐘執行command
3,15 * * * * command
每天上午8-11點的第3和15分鐘執行command:
3,15 8-11 * * * command
每隔2天的上午8-11點的第3和15分鐘執行command:
3,15 8-11 */2 * * command
每個星期一的上午8點到11點的第3和第15分鐘執行command
3,15 8-11 * * 1 command
每晚的21:30重啟smb
30 21 * * * /etc/init.d/smb restart
每月1、10、22日的4 : 45重啟smb
45 4 1,10,22 * * /etc/init.d/smb restart
每周六、周日的1 : 10重啟smb
10 1 * * 6,0 /etc/init.d/smb restart
每天18 : 00至23 : 00之間每隔30分鐘重啟smb
0,30 18-23 * * * /etc/init.d/smb restart
每一小時重啟smb
* */1 * * * /etc/init.d/smb restart
晚上11點到早上7點之間,每隔一小時重啟smb
* 23-7/1 * * * /etc/init.d/smb restart
每月的4號與每周一到周三的11點重啟smb
0 11 4 * mon-wed /etc/init.d/smb restart
每小時執行/etc/cron.hourly目錄內的腳本
0 1 * * * root run-parts /etc/cron.hourly
三、quartz框架中的cron表達式
1. cron表達式編寫的順序一次是”秒 分 時 日 月 周 年”。 quartz中的時間有七段,而Linux中的cron表達式只有五段“分 時 日 月 周”

浙公網安備 33010602011771號