at命令

at排定工作在指定的時間執行
工作排程有所謂的例行性的,也有單一執行一次的,僅執行一次的工作。 要使用這種工作排程時,我們的 Linux 系統上面必須要有負責這個排程的服務,那就是 atd 這個玩意兒。
工作排程會機制
工作寫入 at 工作排程表後,該工作便進入排程當中並等待執行
工作排程表的存放位置
工作排程表預設的 AIX 是在 /var/spool/cron/atjobs 目錄下。
Linux 是在目錄 /var/spool/at 目錄下。
排定一個工作
at 的語法
[root@linux ~]# at [-m] TIME
參數:
-m :當 at 的工作完成後,以 email 的方式通知使用者該工作已完成。
TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項工作』的時間,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作。
HH:MM YYYY-MM-DD ex> 04:00 2005-12-03
強制規定在某年某月的某一天的特殊時刻進行該工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm December 3
也是一樣,強制在某年某月某日的某時刻進行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是說,在某個時間點『再加幾個時間後』才進行。

範例一:再過五分鐘後,將 /root/.bashrc 寄給 dmtsai 這個使用者
[root@linux ~]# at now + 5 minutes
at> /bin/mail dmtsai -s "testing at job" < /root/.bashrc
at> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!
job 8 at 2005-09-07 10:47
# 上面這行資訊在說明,第 8 個 at 工作將在 2005/09/07 的 10:47 進行!

範例二:由於機房預計於 2005/09/16 停電,我想要在 2005/09/15 23:00 關機?
[root@linux ~]# at 23:00 2005-09-15
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at>
job 10 at 2005-09-15 23:00
# 您瞧瞧! at 還可以在一個工作內輸入多個指令呢!不錯吧!
事實上,當我們使用 at 時,at 會給使用者一個 bash shell 讓使用者下達工作指令, 此時,建議你最好使用絕對路徑來下達你的指令,比較不會有問題喔!那我們知道每個指令都可能會有 standard output/standard error 啊,這些可能會輸出到螢幕上面的資訊會跑去哪裡? 呵呵!這些本來應該在螢幕上面出現的資訊通通會以 email 的方式傳送到使用者的 mailbox 裡面去! 而預設如果沒有 stdout/stderr 時,就不會有任何訊息傳送給使用者了。但你可以使用 at -m 這個參數來強制 at 傳送一個執行完畢的 email 訊息給你自己喔! ^_^

權限控管
不過,並不是所有的人都可以進行 at 工作排程喔!為什麼?因為安全的理由啊~ 很多主機被所謂的綁架後,最常發現的就是他們的系統當中有很多的怪客程式 (cracker program) 被寫入例行性命令的排程當中了,所以,那些可惡的程式就可能定時或不定時的在你的系統當中工作, 呵呵!所以囉,除非是您認可的帳號,否則先不要讓他們使用 at 吧! 此外,我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個檔案來進行 at 的使用限制呢! 加上這兩個檔案後, at 的工作情況其實是這樣的:

1. 先找尋 /etc/at.allow 這個檔案,寫在這個檔案中的使用者才能使用 at ,沒有在這個檔案中的使用者則不能使用 at ( 即使沒有寫在 at.deny 當中 );
2. 如果沒有 /etc/at.allow 就尋找 /etc/at.deny 這個檔案,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 檔案中的使用者,就可以使用 at 咯;
3. 如果兩個檔案都不存在,那麼只有 root 可以使用 at 這個指令。

上面的情況說明了,其實我們只要有 at.deny 這個檔案存在就好了,因為我們假設系統內的帳號都是懂得操作的使用者, 因此,預設讓他們可以任意使用 at 這個好用的東西!這也是系統的預設值。我們的 FC4 預設也是只有 /etc/at.deny 存在,而且該檔案內並未有任何帳號資料!這表示任何人均可使用 at 啦!不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可! 一個帳號寫一行。


另外一個 at 的執行優點是什麼呢?那就是『背景執行』的功能了!什麼是背景執行啊?! 很難瞭解嗎?沒關係,鳥哥提我自己的幾個例子來給您聽聽,您就瞭了!

* 由於很多時候,我們其實都是使用 network 連接到主機來進行工作的, 但是 Client 與 Server 之間的網路連線其實並不見得很穩定,尤其是當你的 Client 電腦很忙的時候。 此時,萬一我要進行一項長時間的工作時,那麼風險就很大!鳥哥當初剛剛玩 Unix 時, 由於鳥哥所在的辦公室太小了,無法有多個螢幕與鍵盤,因此,我都是利用我的 windows 98 再以網路連線軟體連到 Unix 主機內作業的。當時我跑一個程式要跑 3 天...... 而眾所皆知的, Windows 98 的長時間開機的穩定性確實..... 在某一次執行時,發生了.....剩下 3 個鐘頭就跑完卻『連線終止』的情況~嗚嗚嗚嗚~ 又得要跑三天....
* 另一個常用的時刻則是例如上面的範例二,由於某個突發狀況導致你必須要進行某項工作時, 這個 at 就很好用啦!
由於 at 工作排程的使用上,系統會將該項 at 工作獨立出你的 bash 環境中, 直接交給系統的 atd 程式來接管,因此,當你下達了 at 的工作之後,就可以立刻離線了, 剩下的工作就完全交給 Linux 管理即可!所以囉,如果有長時間的網路工作時,嘿嘿! 使用 at 可以讓你免除網路斷線後的困擾喔! ^_^
那麼萬一我下達了 at 之後,才發現指令輸入錯誤,該如何是好?呵呵!就將他移除啊! 利用 atq 與 atrm 吧!
[root@linux ~]# atq
[root@linux ~]# atrm [jobnumber]
範例一:查詢目前主機上面有多少的 at 工作排程?
[root@linux ~]# atq
10 2005-09-15 23:00 a root
# 上面說的是:『在 2005/09/15 的 23:00 有一項工作,該項工作指令下達者為
# root』而且,該項工作的工作號碼 (jobnumber) 為 10 號喔!
範例二:將上述的第 10 個工作移除!
[root@linux ~]# atrm 10
[root@linux ~]# atq
# 沒有任何資訊,表示該工作被移除了!
利用 atq 與 atrm 來控制這個 at 的工作吧! ^_^

留言

這個網誌中的熱門文章

浴室水龍頭切換拉桿維修

【麵】的倉頡碼

投資現況