每天一個linux命(ming)令(49):at命(ming)令
在windows系(xi)統(tong)中,windows提供了計劃任務(wu)這一功能,在控制面板 -> 性能與維(wei)護 -> 任務(wu)計劃, 它(ta)的(de)功能就是安排自動運(yun)行的(de)任務(wu)。 通過'添加任務(wu)計劃'的(de)一步步引導,則可建(jian)立一個定時執(zhi)行的(de)任務(wu)。
在(zai)linux系(xi)統中你(ni)可能(neng)已經發現了(le)為(wei)什么系(xi)統常常會自動的(de)(de)進行(xing)一(yi)些(xie)任(ren)(ren)務(wu)?這(zhe)些(xie)任(ren)(ren)務(wu)到底是(shi)誰(shui)在(zai)支配(pei)他們工(gong)(gong)作(zuo)的(de)(de)?在(zai)linux系(xi)統如(ru)(ru)果(guo)你(ni)想(xiang)要讓自己設(she)計的(de)(de)備(bei)份程序(xu)可以(yi)自動在(zai)某(mou)個時間點開始在(zai)系(xi)統底下運行(xing),而(er)不需要手動來啟動它(ta),又(you)該如(ru)(ru)何處置(zhi)呢? 這(zhe)些(xie)例行(xing)的(de)(de)工(gong)(gong)作(zuo)可能(neng)又(you)分(fen)為(wei)一(yi)次(ci)性定(ding)時工(gong)(gong)作(zuo)與循環定(ding)時工(gong)(gong)作(zuo),在(zai)系(xi)統內又(you)是(shi)哪(na)些(xie)服務(wu)在(zai)負責(ze)? 還(huan)有,如(ru)(ru)果(guo)你(ni)想(xiang)要每年在(zai)老(lao)婆的(de)(de)生(sheng)日前一(yi)天就發出一(yi)封信件提醒自己不要忘記,linux系(xi)統下該怎么做呢?
今(jin)天我們主要學習(xi)一下(xia)一次性定時計(ji)劃任務(wu)的at命令的用(yong)法(fa)!
1.命(ming)令(ling)格(ge)式:
at[參數][時間(jian)]
2.命令功能(neng):
在一(yi)個指定(ding)的時(shi)間執(zhi)行(xing)一(yi)個指定(ding)任務,只能執(zhi)行(xing)一(yi)次,且需要開(kai)啟atd進程(
ps -ef | grep atd查看, 開(kai)(kai)啟用(yong)/etc/init.d/atd start or restart; 開(kai)(kai)機即啟動則需要運行 chkconfig --level 2345 atd on)。
3.命令參數:
-m 當指(zhi)定的(de)任務被完成(cheng)之后,將給用戶發(fa)送郵件,即使沒有標準輸(shu)出
-I atq的別名
-d atrm的別名
-v 顯示(shi)任務將被執行的時間
-c 打印任務(wu)的內容到標準輸出
-V 顯示版本信息
-q<列隊> 使用(yong)指定的列隊
-f<文件> 從(cong)指定(ding)文件讀(du)入任務而不(bu)是(shi)從(cong)標準輸入讀(du)入
-t<時間參數(shu)> 以時間參數(shu)的形式提交要(yao)運行(xing)的任務(wu)
at允(yun)許(xu)使用(yong)一套相(xiang)當復雜的(de)(de)指(zhi)(zhi)(zhi)(zhi)定時(shi)(shi)間(jian)(jian)的(de)(de)方法。他(ta)能(neng)(neng)(neng)夠(gou)(gou)接(jie)受在當天的(de)(de)hh:mm(小時(shi)(shi):分鐘)式(shi)(shi)的(de)(de)時(shi)(shi)間(jian)(jian)指(zhi)(zhi)(zhi)(zhi)定。假如該(gai)時(shi)(shi)間(jian)(jian)已過(guo)去,那么就(jiu)放在第二(er)天執(zhi)(zhi)行。當然也能(neng)(neng)(neng)夠(gou)(gou)使用(yong)midnight(深夜),noon(中午(wu)),teatime(飲茶時(shi)(shi)間(jian)(jian),一般是下(xia)午(wu)4點)等(deng)比較模糊的(de)(de) 詞語來指(zhi)(zhi)(zhi)(zhi)定時(shi)(shi)間(jian)(jian)。用(yong)戶(hu)還能(neng)(neng)(neng)夠(gou)(gou)采用(yong)12小時(shi)(shi)計(ji)(ji)時(shi)(shi)制(zhi),即在時(shi)(shi)間(jian)(jian)后(hou)面加上(shang)AM(上(shang)午(wu))或PM(下(xia)午(wu))來說(shuo)明是上(shang)午(wu)還是下(xia)午(wu)。 也能(neng)(neng)(neng)夠(gou)(gou)指(zhi)(zhi)(zhi)(zhi)定命(ming)令執(zhi)(zhi)行的(de)(de)具體日(ri)(ri)期(qi),指(zhi)(zhi)(zhi)(zhi)定格式(shi)(shi)為month day(月(yue)(yue)(yue) 日(ri)(ri))或mm/dd/yy(月(yue)(yue)(yue)/日(ri)(ri)/年)或dd.mm.yy(日(ri)(ri).月(yue)(yue)(yue).年)。指(zhi)(zhi)(zhi)(zhi)定的(de)(de)日(ri)(ri)期(qi)必須跟(gen)在指(zhi)(zhi)(zhi)(zhi)定時(shi)(shi)間(jian)(jian)的(de)(de)后(hou)面。 上(shang)面介紹(shao)的(de)(de)都是絕(jue)對(dui)(dui)計(ji)(ji)時(shi)(shi)法,其實(shi)還能(neng)(neng)(neng)夠(gou)(gou)使用(yong)相(xiang)對(dui)(dui)計(ji)(ji)時(shi)(shi)法,這(zhe)(zhe)對(dui)(dui)于安(an)排不久(jiu)就(jiu)要執(zhi)(zhi)行的(de)(de)命(ming)令是很(hen)有好處的(de)(de)。指(zhi)(zhi)(zhi)(zhi)定格式(shi)(shi)為:now + count time-units ,now就(jiu)是當前時(shi)(shi)間(jian)(jian),time-units是時(shi)(shi)間(jian)(jian)單(dan)位,這(zhe)(zhe)里(li)能(neng)(neng)(neng)夠(gou)(gou)是minutes(分鐘)、hours(小時(shi)(shi))、days(天)、weeks(星期(qi))。count是時(shi)(shi)間(jian)(jian)的(de)(de)數(shu)量,究竟是幾(ji)天,還是幾(ji)小時(shi)(shi),等(deng)等(deng)。 更有一種計(ji)(ji)時(shi)(shi)方法就(jiu)是直接(jie)使用(yong)today(今天)、tomorrow(明天)來指(zhi)(zhi)(zhi)(zhi)定完成命(ming)令的(de)(de)時(shi)(shi)間(jian)(jian)。
TIME:時(shi)間格式,這(zhe)里可(ke)以定義出什么時(shi)候要進行 at 這(zhe)項任務的時(shi)間,格式有:
HH:MM
ex> 04:00
在今日的 HH:MM 時(shi)(shi)刻進行,若該時(shi)(shi)刻已超(chao)過,則(ze)明天的 HH:MM 進行此任務。
HH:MM YYYY-MM-DD
ex> 04:00 2009-03-17
強制規定(ding)在某(mou)年某(mou)月的(de)某(mou)一天的(de)特殊(shu)時刻進行該項任務
HH:MM[am|pm] [Month] [Date]
ex> 04pm March 17
也是一(yi)樣(yang),強制(zhi)在(zai)某(mou)年某(mou)月某(mou)日的某(mou)時(shi)刻進行該(gai)項任務
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes
ex> 04pm + 3 days
就是說,在某個(ge)(ge)時間點(dian)再加(jia)幾(ji)個(ge)(ge)時間后(hou)才進行該項任務。
4.使用實例(li):
實例1:三天(tian)后的下(xia)午 5 點鍾執行 /bin/ls
命(ming)令:
at 5pm+3 days
輸出:
[root@localhost ~]# at 5pm+3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00
[root@localhost ~]#
說明:
實例2:明(ming)天(tian)17點鐘(zhong),輸出(chu)時間到指定文件(jian)內
命令:
at 17:20 tomorrow
輸出:
[root@localhost ~]# at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20
[root@localhost ~]#
說明:
實(shi)例3:計劃任(ren)務設定后,在沒有(you)執(zhi)行之(zhi)前我們可以用atq命令來查(cha)看系統沒有(you)執(zhi)行工作任(ren)務
命令(ling):
atq
輸出:
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]#
說明:
實(shi)例4:刪除已經設置的(de)任務
命令(ling):
atrm 7
輸出(chu):
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
7 2013-01-08 17:00 a root
[root@localhost ~]# atrm 7
[root@localhost ~]# atq
8 2013-01-06 17:20 a root
[root@localhost ~]#
說明:
實(shi)例(li)5:顯示已經(jing)設置的任務內(nei)容
命令:
at -c 8
輸(shu)出:
[root@localhost ~]# at -c 8
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22此處省略(lve)n個字(zi)符(fu)
date >/root/2013.log
[root@localhost ~]#
說明:
實(shi)例6:
命令:
輸出:
說明:
5.atd 的啟動與 at 運行(xing)的方式:
5.1 atd 的啟動(dong)
要使用一次性計劃任務時(shi),我們的 Linux 系統上面必須要(yao)有負責這個計劃任務的(de)服務,那就是 atd 服務。 不過并非所(suo)有的 Linux distributions 都默認會把(ba)他(ta)打開的,所(suo)以,某些時刻我們(men)需要(yao)手動將atd 服務激(ji)(ji)活(huo)(huo)才行。 激(ji)(ji)活(huo)(huo)的方法很簡(jian)單,就是(shi)這樣:
命令:
/etc/init.d/atd start
/etc/init.d/atd restart
輸出:
[root@localhost /]# /etc/init.d/atd start
[root@localhost /]# /etc/init.d/atd
用法(fa):/etc/init.d/atd {start|stop|restart|condrestart|status}
[root@localhost /]# /etc/init.d/atd stop
停止 atd:[確定]
[root@localhost /]# ps -ef|grep atd
root 25062 24951 0 14:53 pts/0 00:00:00 grep atd
[root@localhost /]# /etc/init.d/atd start
[確(que)定]td:[確(que)定]
[root@localhost /]# ps -ef|grep atd
root 25068 1 0 14:53 ? 00:00:00 /usr/sbin/atd
root 25071 24951 0 14:53 pts/0 00:00:00 grep atd
[root@localhost /]# /etc/init.d/atd restart
停止 atd:[確定]
[確定]td:[確定]
[root@localhost /]#
說明:
/etc/init.d/atd start 沒有啟動的時候,直接啟動atd服務
/etc/init.d/atd restart 服(fu)務已經(jing)啟動后,重啟 atd 服(fu)務
備注(zhu):配置一下啟(qi)動時就啟(qi)動這個(ge)服(fu)務,免(mian)得(de)每(mei)次(ci)重新啟(qi)動都得(de)再來一次(ci)
命令:
chkconfig atd on
輸出:
[root@localhost /]# chkconfig atd on
[root@localhost /]#
5.2 at 的運行(xing)方(fang)式(shi)
既然是計劃任務,那么應該(gai)會有任務執行的(de)方(fang)式,并且將這些(xie)任務排進行程表中(zhong)。那么產生計劃任務的(de)方式是怎(zen)么進(jin)行(xing)的(de)? 事實上,我們使用 at 這個(ge)命令(ling)來產生所要運行的(de)計劃任務,并(bing)將這個計(ji)劃任務以文字檔的方式寫入 /var/spool/at/ 目(mu)錄內,該工作便能等(deng)待 atd 這個服務的取用(yong)與運行了。就這么簡單。
不過,并(bing)不是所(suo)有的(de)人都可以(yi)進(jin)行(xing) at 計(ji)劃任務(wu)。為(wei)什么? 因為(wei)系統安(an)全的原(yuan)因。很多主機被(bei)所謂的攻擊破解(jie)后,最常(chang)發現的就是(shi)他(ta)們的系(xi)統當中多了很多的黑客程序, 這些程序非常可(ke)能運用(yong)一些計(ji)劃任務來運行或(huo)搜集你的(de)系統運行(xing)信息,并定時的發(fa)送給黑(hei)客。 所(suo)以,除非是(shi)你(ni)認可的(de)帳(zhang)號,否則(ze)先不要(yao)讓他們使用 at 命令。那怎么(me)達到使用(yong) at 的可控呢?
我(wo)們可以利用 /etc/at.allow 與 /etc/at.deny 這兩(liang)個文件(jian)來進行 at 的使用限制。加上這兩個文件(jian)后, at 的(de)(de)工作(zuo)情(qing)況是這樣的(de)(de):
先找尋 /etc/at.allow 這個(ge)文(wen)件,寫(xie)在這個(ge)文(wen)件中(zhong)的使(shi)(shi)(shi)用(yong)(yong)者才能(neng)使(shi)(shi)(shi)用(yong)(yong) at ,沒有(you)在這個(ge)文(wen)件中(zhong)的使(shi)(shi)(shi)用(yong)(yong)者則(ze)不能(neng)使(shi)(shi)(shi)用(yong)(yong) at (即使(shi)(shi)(shi)沒有(you)寫(xie)在 at.deny 當中(zhong));
如果 /etc/at.allow 不(bu)存在,就尋找 /etc/at.deny 這(zhe)個文(wen)(wen)件(jian),若寫在這(zhe)個 at.deny 的使(shi)用者(zhe)則不(bu)能使(shi)用 at ,而沒有在這(zhe)個 at.deny 文(wen)(wen)件(jian)中的使(shi)用者(zhe),就可以使(shi)用 at 命令(ling)了。
如果兩個文件(jian)都不存(cun)在,那(nei)么只有 root 可以(yi)使用 at 這個命令。
透過這個(ge)說明,我們知道 /etc/at.allow 是管理較為(wei)嚴格的(de)方(fang)式,而 /etc/at.deny 則較為(wei)松散 (因(yin)為(wei)帳號沒有(you)在(zai)該文件中,就能夠運行 at 了)。在(zai)一般的(de) distributions 當中,由于假設系(xi)統(tong)(tong)上的所有(you)用戶(hu)都是可信任的, 因(yin)此(ci)系(xi)統(tong)(tong)通(tong)常會保留一(yi)個空的 /etc/at.deny 文(wen)件(jian),意思(si)是允許所有(you)人使(shi)用 at 命令的意思(si) (您可以自行檢查(cha)一(yi)下該(gai)文(wen)件(jian))。 不過,萬一(yi)你不希望有(you)某些(xie)使(shi)用者使(shi)用 at 的話(hua),將那個使(shi)用者的帳號寫入 /etc/at.deny 即(ji)可! 一(yi)個帳號寫一(yi)行。
關注 熵減黑客 ,一起學習成長
