天天看點

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 項工作内容列出來查閱

[[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 來管理的!