1、atd的啟動與at運作方式
[[email protected] ~]# systemctl restart atd # 重新啟動 atd 這個服務
[[email protected] ~]# systemctl enable atd # 讓這個服務開機就自動啟動
[[email protected] ~]# systemctl status atd # 查閱一下 atd 目前的狀态
<1>at的運作方式
我們使用at指令産生所要運作的工作,并将該工作已文本檔案的方式寫入/var/spool/at目錄中,該工作便能等待atd這個服務的取用與執行。我們可以利用 /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 這個指令。
2、實際運作單一工作排程
[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 2015-07-30
強制規定在某年某月的某一天的特殊時刻進行該工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
也是一樣,強制在某年某月某日的某時刻進行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是說,在某個時間點『再加幾個時間後』才進行。
範例一:再過五分鐘後,将 /root/.bashrc 寄給 root 自己
[[email protected] ~]# at now + 5 minutes <==記得機關要加 s 喔!
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> <EOT> <==這裡輸入 [ctrl] + d 就會出現 <EOF> 的字樣!代表結束!
job 2 at Thu Jul 30 19:35:00 2015
# 上面這行資訊在說明,第 2 個 at 工作将在 2015/07/30 的 19:35 進行!
# 而執行 at 會進入所謂的 at shell 環境,讓你下達多重指令等待運作!
範例二:将上述的第 2 項工作内容列出來查閱
[[email protected] ~]# at -c 2
#!/bin/sh <==就是透過 bash shell 的啦!
# atrun uid=0 gid=0
# mail root 0
umask 22
....(中間省略許多的環境變量項目)....
cd /etc/cron\.d || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER410efc26'
/bin/mail -s "testing at job" root < /root/.bashrc # 這一行最重要!
marcinDELIMITER410efc26
由于at工作排程的使用上,系統會将該項的at工作獨立的顯示在你的bash環境中,直接交給系統的atd程式來接管,是以當你下達了at的工作之後就立刻脫機,剩下的工作由Linux完成。
<1>at的工作管理
指令: $ atq #查詢目前主機上有多少at工作排程
指令: $ strm (jobnumber) #将查詢的工作排程移除
<2>batch:系統有空時才進行背景任務
batch會在CPU的工作負載小于0.8的時候進行所下達的任務
範例一:請執行 pi 的計算,然後在系統閑置時,執行 updatdb 的任務
[[email protected] ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[[email protected] ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[[email protected] ~]# echo "scale=100000; 4*a(1)" | bc -lq &
[[email protected] ~]# echo "scale=100000; 4*a(1)" | bc -lq &
# 然後等待個大約數十秒的時間,之後再來确認一下工作負載的情況!
[[email protected] ~]# uptime
19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96
[[email protected] ~]# batch
at> /usr/bin/updatedb
at> <EOT>
job 4 at Thu Jul 30 19:57:00 2015
[[email protected] ~]# date;atq
Thu Jul 30 19:57:47 CST 2015
4 Thu Jul 30 19:57:00 2015 b root
# 可以看得到,明明時間已經超過了,卻沒有實際執行 at 的任務!
[[email protected] ~]# jobs
[1] Running echo "scale=100000; 4*a(1)" | bc -lq &
[2] Running echo "scale=100000; 4*a(1)" | bc -lq &
[3]- Running echo "scale=100000; 4*a(1)" | bc -lq &
[4]+ Running echo "scale=100000; 4*a(1)" | bc -lq &
[[email protected] ~]# kill -9 %1 %2 %3 %4
# 這時先用 jobs 找出背景工作,再使用 kill 删除掉四個背景工作後,慢慢等待工作負載的下降
[[email protected] ~]# uptime; atq
20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40
4 Thu Jul 30 19:57:00 2015 b root
[[email protected] ~]# uptime; atq
20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28
# 在 19:59 時,由于 loading 還是高于 0.8,是以 atq 可以看得到 at job 還是持續再等待當中喔!
# 但是到了 20:01 時, loading 降低到 0.8 以下了,是以 atq 就執行完畢啰!
使用 uptime 可以觀察到 1, 5, 15 分鐘的『平均工作負載』量,因為是平均值,是以當我們如上表删
除掉四個工作後,工作負載不會立即降低, 需要一小段時間讓這個 1 分鐘平均值慢慢回複到接近 0
啊!當小于 0.8 之後的『整分鐘時間』時,atd 就會将 batch 的工作執行掉了!
什麼是『整分鐘時間』呢?不論是 at 還是底下要介紹的 crontab,他們最小的時間機關是『分鐘』,
是以,基本上,他們的工作是『每分鐘檢查一次』來處理的! 就是整分 (秒為 0 的時候),這樣了
解乎?同時,你會發現其實 batch 也是使用 atq/atrm 來管理的!