Linux command - 定時任務
Linux下關於定時執行任務的方式有at/batch/crond/anacron 四種方式
其中 at 和 batch是針對 一次性任務; crontab 和 anacrontab 是針對規律性可重複執行的任務
at / batch
一次執行任務,實際使用中很少用到,具體的用法可以參考
https://www.computerhope.com/unix/uat.htmcrontab
在固定的間隔時間執行指定的系統指令或 shell script指令碼;時間最小可以到分鐘
格式:
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
一般對於使用者自己建立的任務,都是通過crontab -e/crontab -l
來建立和檢視,管理員可以通過crontab -e user /crontab -l user
來檢視別的使用者的;
實際儲存在 /var/spool/cron/xxxx ; xxxx 代表的是具體的Linux 使用者
舉例說明:
分 時 日 月 周 command
0,15,30 18-06 * * * /bin/echo ' hello world' > /tmp/crontab-test.txt
格式欄位說明:
代表意義 | 分 | 時 | 日 | 月 | 周 | command |
---|---|---|---|---|---|---|
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7(0和7都表示週日) | 需要執行的命令 |
特殊設定說明:
特殊字元 | 代表意義 |
---|---|
* | 代表任何時刻。比如第一個 * 代表一個小時中每一分鐘都執行一次。 |
, | 代表不連續的時間。比如 0 8,12,16 * * * command 表示每天8點,12點,16點執行一次 |
- | 代表連續時間範圍。比如 0 8-12 * * * command 表示每天8點到12點,每小時都執行一次 |
*/n | 那個 n 代表數字,代表‘每隔 n 單位時間執行一次’。例如 */5 * * * * command 表示每五分鐘進行一次 |
當然也可以同樣的把對應的任務新增到/etc/crontab
; 預設該檔案為:
root@pts/4 $ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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-namecommand to be executed
或者把寫好的指令碼放到/etc/cron.d/
下面;系統會每分鐘都去檢測該目錄下檔案
anacrontab
anacron以天為單位週期性地執行命令,所以最小單位是天;它的優點在於,如果伺服器在某段時間關機了,在開機之後,會自動執行在關機期間沒有執行的任務;
anacrontab 不是daemon程式,所有它的執行其實是依賴於 crontab的,這個我們在crontab 和 anacrontab 聯絡
中具體體現;
anacrontab 的主配置檔案是/etc/anacrontab
從配置檔案可以看出,anacrontab 控制 daily/weekly/monthly 下面的任務的執行
格式:
perioddelayjob-identifiercommand
@daily10lctest.daily/bin/bash /opt/lstest.sh
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in daysdelay in minutesjob-identifiercommand 15cron.dailynice run-parts /etc/cron.daily 725cron.weeklynice run-parts /etc/cron.weekly @monthly 45 cron.monthlynice run-parts /etc/cron.monthly
period in days - 這是任務的頻率,以天來指定,或者是 @daily、@weekly、@monthly 代表每天、每週、每月一次。你也可以使用數字:1 - 每天、7 - 每週、30 - 每月,或者 N - 幾天。
delay in minutes - 這是在執行一個任務前等待的分鐘數。
job-id - 這是寫在日誌檔案中任務的獨特名字。
command - 這是要執行的命令或 shell 指令碼。
crontab 和 anacrontab 聯絡
+----------------------+ | /etc/cron.d/0hourly| +----------------------+ | V +---------------------------+ | /etc/cron.hourly/0anacron | +---------------------------+ | V +----------------------+ | /usr/sbin/anacron -s | +----------------------+ | V +-----------------+ | /etc/anacrontab | +-----------------+ | V +---------------------+ | /etc/cron.daily| | /etc/cron.weekly| | /etc/cron.monthly| +---------------------+
crontab 和 anacrontab 區別
1、Anacron以天為單位週期性地執行命令。而 cron 最小執行的週期是分鐘。其實不然,cron 和 anacron 是兩種完全不相干的任務排程工具(雖然它們可以結合使用)
2、cron 是通過daemon程式 crond 來執行任務;而 anacron 則沒有任何daemon程式,它所對應的 anacron 程序執行完畢就退出。
3、cron 在執行任務時不做任何跟時間相關記錄;而 anacron 會記錄下任務完成的時間,這樣就給本應該執行卻沒有執行的任務再執行的條件和機會。
4、crontab 是針對不停機主機上執行的任務;anacrontab是針對可停機主機上執行的任務;
具體例子就是 有個任務在 凌晨 01:00 到 02:00 之間執行,結果某一天該時間段是關機維修了。那麼:
使用 crontab 建立的任務在開機之後是不會執行的
使用 anacrontab 建立的任務可以在 開機之後根據實際的配置延遲來 繼續執行 那個時間段沒有執行的任務
anacrontab 能在開機後自動執行
anacron 能做到任務“不錯過”的關鍵點在於它每執行完一次便記錄完成的時間。anacron 程序執行任務的時候先通過檔案裡的上次完成時間和其它的配置判斷能否執行,如果能執行則建立一個新的程序執行,當前程序退出;如不能執行則直接退出。詳細的過程可通過 strace -f /usr/sbin/anacron 看到。