鳥哥的Linux私房菜讀書筆記--執行一次的工作排程
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 項工作內容列出來查閱
[
由於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 來管理的!