首先,我們先來談談單一計劃任務的執行,那就是 at 這個命令的執行!
atd 的啟動與 at 執行的方式
要使用單一計劃任務時,我們的 Linux 系統上面必須要有負責這個計劃任務的服務,那就是 atd 這個玩意兒。 不過並非所有的 Linux distributions 都預設會把他打開的,所以呢,某些時刻我們必須要手動將他啟用才行。 啟用的方法很簡單,就是這樣:
[[email protected] ~]# /etc/init.d/atd restart
正在停止 atd: [ 確定 ]
正在激活 atd: [ 確定 ]
# 再設定一下開機時就啟動這個服務,免得每次重新開機都得再來一次!
[[email protected] ~]# chkconfig atd on
● at 的執行方式
既然是計劃任務,那麼應該會有計劃執行的方式,並且將這些任務添加到隊列中啰!OK!那麼計劃執行的方式是怎麼實現的? 事實上,我們使用 at 這個命令來產生所要執行的任務,並將這個任務以文字文件的方式寫入 /var/spool/at/目錄內,該任務便能等待 atd 這個服務的取用與執行了。就這麼簡單。不過,並不是所有的人都可以進行 at 計劃任務喔!為什麼?因為安全的理由啊~ 很多主機被所謂的『綁架』後,最常發現的就是他們的系統當中多了很多的黑客程序 (cracker program), 這些程序非常可能運用計劃任務來執行或搜集
系統信息,並定時的回報給黑客團體! 所以啰,除非是你認可的賬號,否則先不要讓他們使用 at 吧!那怎麼限制使用 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 這個命令。通過這個說明,我們知道 /etc/at.allow 是管理較為嚴格的方式,而 /etc/at.deny 則較為松散 (因為賬號沒有在該文件中,就能夠執行 at 了)。在一般的 distributions 當中,由於假設系統上的所有用戶都是可信任的, 因此系統通常會保留一個空的 /etc/at.deny 文件,意思是允許所有人使用 at 命令的意思 (您可以自行檢查一下該文件)。 不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的賬號寫入 /etc/at.deny 即可! 一個賬號寫一行。
實際執行單一計劃任務
單一計劃任務的進行就使用 at 這個命令啰!這個命令的執行非常簡單!將 at 加上一個時間即可!基本的語法如下:
[[email protected] ~]# at [-mldv] TIME
[[email protected] ~]# at -c 任務號碼
選項與參數:
-m :當 at 的任務完成後,即使沒有輸出訊息,亦以 email 通知使用者該任務已完成。
-l :at -l 相當於 atq,列出目前系統上面的所有該使用者的 at 計劃任務;
-d :at -d 相當於 atrm ,可以取消一個在 at 計劃任務中的任務;
-v :可以使用較明顯的時間格式列出 at 計劃任務中的任務列表;
-c :可以列出後面接的該項任務的實際命令內容。
TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項任務』的時間,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此任務。
HH:MM YYYY-MM-DD ex> 04:00 2009-03-17
強制規定在某年某月的某一天的特殊時刻進行該任務!
HH:MM[am|pm] [Month] [Date] ex> 04pm March 17
也是一樣,強制在某年某月某日的某時刻進行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是說,在某個時間點『再加幾個時間後』才進行。
老實說,這個 at 命令的下達最重要的地方在於『時間』的指定了!鳥哥喜歡使用『 now + … 』 的方式來定義現在過多少時間再進行任務,但有時也需要定義特定的時間點來進行!底下的例子先看看啰!
例子一:再過五分鐘後,將 /root/.bashrc 寄給 root 自己
[[email protected] ~]# at now + 5 minutes <==記得單位要加 s 喔! at> /bin/mail root -s "testing at job" < /root/.bashrc at> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!
job 4 at 2009-03-14 15:38
# 上面這行信息在說明,第 4 個 at 任務將在 2009/03/14 的 15:38 進行!
# 而執行 at 會進入所謂的 at shell 環境,讓你下達多重命令等待執行!
例子二:將上述的第 4 項任務內容列出來查閱
[[email protected] ~]# at -c 4
#!/bin/sh <==就是透過 bash shell 的啦!
# atrun uid=0 gid=0
# mail root 0
umask 22
....(中間省略許多的環境變量項目)....
cd /root || { <==可以看出,會到下達 at 時的任務目錄去執行命令 echo 'Execution directory inaccessible' >&2
exit 1
}
/bin/mail root -s "testing at job" < /root/.bashrc
# 你可以看到命令執行的目錄 (/root),還有多個環境變量與實際的命令內容啦!
例子三:由於機房預計於 2009/03/18 停電,我想要在 2009/03/17 23:00 關機?
[[email protected] ~]# at 23:00 2009-03-17
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at>
job 5 at 2009-03-17 23:00
# 您瞧瞧! at 還可以在一個任務內輸入多個命令呢!不錯吧!
事實上,當我們使用 at 時會進入一個 at shell 的環境來讓使用者下達任務命令,此時,建議你最好使用絕對路徑來下達你的命令,比較不會有問題喔!由於命令的下達與 PATH 變量有關, 同時與當時的任務目錄也有關連 (如果有牽涉到文件的話),因此使用絕對路徑來下達命令,會是比較一勞永逸的方法。 為什麼呢?舉例來說,你在 /tmp 下達『 at now 』然後輸入『 mail root -s “test” < .bashrc 』, 問一下,那個 .bashrc 的文件會是在哪裡?答案是『 /tmp/.bashrc 』!因為 at 在執行時,會跑到當時下達 at 命令的那個任務目錄的緣故啊!有些朋友會希望『我要在某某時刻,在我的終端機顯示出 Hello 的字樣』,然後就在 at 裡面下達這樣的信息『 echo “Hello” 』。等到時間到了,卻發現沒有任何訊息在屏幕上顯示,這是啥原因啊?這是因為 at 的執行與終端機環境無關,而所有 standard output/standard error output 都會傳送到執行者的 mailbox 去啦!所以在終端機當然看不到任何信息提示。那怎辦?沒關系, 可以透過終端機的裝置來處理!假如你在 tty1 登入,則可以使用『 echo “Hello” > /dev/tty1 』來替代。
Tips:
要注意的是,如果在 at shell 內的命令並沒有任何的訊息輸出,那麼 at 預設不會發email 給執行者的。 如果你想要讓 at 無論如何都發一封 email 告知你是否執行了指令,那麼可以使用『 at -m 時間格式 』來下達命令喔! at 就會傳送一個訊息給執行者,而不論該命令執行有無訊息輸出了!
at 有另外一個很棒的優點,那就是『背景執行』的功能了!什麼是背景執行啊?很難了解嗎?其實與 bash 的 nohup 類似啦! 鳥哥提我自己的幾個例子來給您聽聽,您就明白了!
● 離線繼續任務的任務:鳥哥初次接觸 Unix 為的是要跑空氣質量模式, 那是一種大型的程序,這個程序在當時的硬件底下跑,一個案例要跑 3 天!由於鳥哥也要進行其它研究任務,因此常常使用 Windows 98 來聯機到Unix 任務站跑那個 3 天的案例!結果你也該知道, Windows 98 連開三天而不當機的機率是很低的~@_@~而當機時,所有在 Windows 上的聯機都會中斷!包括鳥哥在跑的那個程序也中斷了~嗚嗚~明明再三個鐘頭就跑完的程序, 由於當機害我又得跑 3 天!
● 另一個常用的時刻則是例如上面的例子三,由於某個突發狀況導致你必須要進行某項任務時,這個 at 就很好用啦!
由於 at 計劃任務的使用上,系統會將該項 at 任務獨立出你的 bash 環境中, 直接交給系統的 atd 程序來接管,因此,當你下達了 at 的任務之後就可以立刻離線了, 剩下的任務就完全交給 Linux 管理即可!所以啰,如果有長時間的網絡任務時,嘿嘿! 使用 at 可以讓你免除網絡斷線後的困擾喔! ^_^
● at 任務的管理
那麼萬一我下達了 at 之後,才發現命令輸入錯誤,該如何是好?就將他移除啊!利用 atq 與 atrm 吧!
[[email protected] ~]# atq
[[email protected] ~]# atrm (jobnumber)
例子一:查詢目前主機上面有多少的 at 計劃任務?
[[email protected] ~]# atq
5 2009-03-17 23:00 a root
# 上面說的是:『在 2009/03/17 的 23:00 有一項任務,該項任務命令下達者為
# root』而且,該項任務的任務號碼 (jobnumber) 為 5 號喔!
例子二:將上述的第 5 個任務移除!
[[email protected] ~]# atrm 5
[[email protected] ~]# atq
# 沒有任何信息,表示該任務被移除了!
如此一來,你可以利用 atq 來查詢,利用 atrm 來刪除錯誤的命令,利用 at 來直接下達單一計劃任務!很簡單吧! 不過,有個問題需要處理一下。如果你是在一個非常忙碌的系統下執行 at , 能不能指定你的任務在系統較閒的時候才進行呢?可以的,那就使用 batch 命令吧!
● batch:系統有空時才進行背景任務
其實 batch 是利用 at 來進行命令的下達啦!只是加入一些控制參數而已。這個 batch 神奇的地方在於:他會在 CPU任務負載小於 0.8 的時候,才進行你所下達的任務任務啦! 那什麼是負載 0.8 呢?這個負載的意思是: CPU 在單一時間點所負責的任務數量。不是 CPU 的使用率喔! 舉例來說,如果我有一只程序他需要一直使用 CPU 的運算功能,那麼此時 CPU 的使用率可能到達 100% , 但是 CPU 的任務負載則是趨近於『 1 』,因為 CPU 僅負責一個任務嘛!如果同時執行這樣的程序兩支呢? CPU 的使用率還是 100% ,但是任務負載則變成 2 了!了解乎?
所以也就是說,當 CPU 的任務負載越大,代表 CPU 必須要在不同的任務之間進行頻繁的任務切換。 這樣的 CPU 運作情況我們在第零章有談過,忘記的話請回去瞧瞧!因為一直切換任務,所以會導致系統忙碌啊! 系統如果很忙碌,還要額外進行 at ,不太合理!所以才有 batch 命令的產生!
那麼 batch 如何下達命令呢?很簡單啊!與 at 相同啦!例如下面的例子:
例子一:同樣是機房停電在 2009/3/17 23:00 關機,但若當時系統負載太高,則暫緩執行
[[email protected] ~]# batch 23:00 2009-3-17
at> sync
at> sync
at> shutdown -h now
at>
job 6 at 2009-03-17 23:00
[[email protected] ~]# atq
6 2009-03-17 23:00 b root
[[email protected] ~]# atrm 6
你會發現其實 batch 也是使用 atq/atrm 來管理的!這樣了解乎?