iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 27
0
Software Development

Linux從零開始系列 第 27

Linux從零開始(27/30): 一次性的工程排程at

執行at時,必須要有atd著個服務,剛好CentOS預設是啟動的^^

重新啟動atd這個服務

systemctl restart atd

開機就自動啟動atd服務

systemctl enable atd

atd目前狀態檢視

[root@localhost test]# systemctl status atd
atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
   Active: active (running) since Thu 2015-07-30 19:21:21 CST; 23s ago
 Main PID: 26503 (atd)
   CGroup: /system.slice/atd.service
           └─26503 /usr/sbin/atd -f

Jul 30 19:21:21 study.centos.vbird systemd[1]: Starting Job spooling tools...
Jul 30 19:21:21 study.centos.vbird systemd[1]: Started Job spooling tools.

使用atd指令產生要運作的文字檔文件寫入/var/spool/at/

還記得朕不給的你不能要的概念嗎?
在linux的領域裡,權限的控管是相當嚴謹的,不被允許的不準用。
利用/etc/at.allow跟/etc/at.deny進行使用限制。

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

來試一試吧

at [-mldv] TIME
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 自己
[root@study ~]# at now + 5 minutes <==記得單位要加 s 喔!
at> /bin/mail -s "testing at job" root < /root/.bashrc
at> <==這裡輸入 [ctrl] + d 就會出現 的字樣!代表結束!
job 2 at Thu Jul 30 19:35:00 2015

上面這行資訊在說明,第 2 個 at 工作將在 2015/07/30 的 19:35 進行!

而執行 at 會進入所謂的 at shell 環境,讓你下達多重指令等待運作!

範例二:將上述的第 2 項工作內容列出來查閱
[root@study ~]# 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

你可以看到指令執行的目錄 (/root),還有多個環境變數與實際的指令內容啦!

範例三:由於機房預計於 2015/08/05 停電,我想要在 2015/08/04 23:00 關機?
[root@study ~]# at 23:00 2015-08-04
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at>
job 3 at Tue Aug 4 23:00:00 2015

您瞧瞧! at 還可以在一個工作內輸入多個指令呢!不錯吧!

參考
http://linux.vbird.org/linux_basic/0430cron.php#whatiscron_type


上一篇
Linux從零開始(26/30): 例行性工作排程crontab
下一篇
Linux從零開始(28/30): Python3與舊版的切換
系列文
Linux從零開始30

尚未有邦友留言

立即登入留言