無論服務器是什麼操作系統,我們都不能無時無刻的登錄到服務器上進行一些操作,那麼我們就需要使用任務計劃來讓Linux系統自動運行一些程序。
Linux系統中有at、batch和crontab任務計劃,接下來就看看這三個任務計劃是怎麼幫助我們實現自動執行程序的吧
一、一次性任務
1、at
常用
at TIME
at>
Ctrl +d:提交任務
at允許使用一套相當複雜的指定時間的方法。他能夠接受在當天的hh:mm(小時:分鐘)式的時間指定。假如該時間已過去,那麼就放在第二天執行。當然也能夠使用midnight(深夜),noon(中午),teatime(飲茶時間,一般是下午4點)等比較模糊的 詞語來指定時間。用戶還能夠採用12小時計時制,即在時間後面加上AM(上午)或PM(下午)來說明是上午還是下午。 也能夠指定命令執行的具體日期,指定格式爲month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必須跟在指定時間的後面。 上面介紹的都是絕對計時法,其實還能夠使用相對計時法,這對於安排不久就要執行的命令是很有好處的。指定格式爲:now + count time-units ,now就是當前時間,time-units是時間單位,這裏能夠是minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,究竟是幾天,還是幾小時,等等。 更有一種計時方法就是直接使用today(今天)、tomorrow(明天)來指定完成命令的時間。
[root@myb362 scripts]# at now+1min
at> uptime
at> <EOT>
job 1 at 2014-03-28 19:44等待一分鐘之後,at會給當前用戶發送mail,我使用的root用戶,使用mail可以查看。
添加一個明天早上7點執行的任務
[root@myb362 scripts]# at 07:00 tomorrow
at> uptime
at> <EOT>
job 2 at 2014-03-29 07:00顯示系統中的任務計劃
atq
[root@myb362 scripts]# atq
2 2014-03-29 07:00 a root刪除系統中的任務計劃
atrm
[root@myb362 scripts]# atq
2 2014-03-29 07:00 a root
[root@myb362 scripts]# atrm 2
[root@myb362 scripts]# atq
[root@myb362 scripts]#2、batch :跟at一樣也是定期執行的命令,使用方法也跟at相同,但是不同的是batch不需要指定時間,因爲它會自動在系統負載比較低的時候執行(平均負載小於0.8的時候)
二、週期性任務
crontab
crontab配置文件
系統cron:/etc/crontab
用戶cron:/var/spool/cron/USERNAME
crontab配置文件的差別
用戶cron:6個字段,與系統cron相比,無需指定用戶身份
系統cron:在/etc/crontab配置文件中指定
cron配置文件解釋
# 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
在配置文件中,我們是可以使用通配符來指定不同的運行時間的
*:相應時間點的所有有效取值
,: 離散取值, 3,18,33,48 * * * * root cat /etc/fstab
/: 定義指定取值範圍內的頻率, 例如:*/3 * * * * root cat /etc/fstab 17 */3 * * * root cat /etc/fstab
-: 連續取值:17 8-20/3 * * * root cat /etc/fstabcrontab任務計劃中,默認最小運行時間爲分鐘,那麼如何以秒爲單位執行任務計劃呢
方法1:
每隔30秒執行一次腳本
* * * * * /bin/cat /etc/fstab
* * * * * sleep 30 && /bin/cat /etc/fstab方法2:
每隔15秒執行一次腳本
* * * * * for i in 0 1 2; do some_job && sleep 15; done; some_job