概述
前不久我們梳理了Linux中的計劃任務—Crontab排程重複執行的任務,但是有些場景我們隻是需要執行一次,執行完就結束任務該怎麼辦呢? 這裡我們要用到linux提供的at/batch指令。
本篇博文我們将從如下幾個要點來闡述:
- 送出at作業(指令或者shell腳本),使之在某個指定時間開始執行
- 顯示或者删除已經送出的at作業
- 控制使用者是否能夠使用at指令送出定時作業
以下執行個體為Centos6.5作業系統的示範結果
服務啟動
預設情況下所有的linux系統都提供此項功能。在redhat中atd是預設随系統啟動而啟動。
[root@entel2 ~]# ps -ef | grep atd #檢視atd服務
rpcuser 5544 1 0 Sep28 ? 00:00:00 rpc.statd
root 6012 1 0 Sep28 ? 00:00:00 /usr/sbin/atd
root 8651 8543 0 15:58 pts/0 00:00:00 grep atd
[root@entel2 ~]# service atd status #檢視atd服務狀态
atd (pid 6012) is running...
[root@entel2 ~]# chkconfig --help
chkconfig version 1.3.49.3 - Copyright (C) 1997-2000 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.
usage: chkconfig [--list] [--type ] [name]
chkconfig --add
chkconfig --del
chkconfig --override
chkconfig [--level ] [--type ] <on|off|reset|resetpriorities>
[root@entel2 ~]# chkconfig --level 2345 atd on #開機啟動atd服務
[root@entel2 ~]#
[root@entel2 ~]# /etc/init.d/atd start #啟動atd服務
[root@entel2 ~]# /etc/init.d/atd restart
Stopping atd: [ OK ]
Starting atd: [ OK ]
[root@entel2 ~]# service atd start #啟動atd服務
[root@entel2 ~]# service atd restart #重新開機atd服務
Stopping atd: [ OK ]
Starting atd: [ OK ]
[root@entel2 ~]# service atd # atd服務支援的參數
Usage: /etc/init.d/atd {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
複制
文法
at [-mld] time [date]
複制
參數詳解:
-m 當指定的任務被完成之後,将給使用者發送郵件,即使沒有标準輸出
-I atq的别名
-d atrm的别名
-v 顯示任務将被執行的時間
-c 列印任務的内容到标準輸出
-V 顯示版本資訊
-q<列隊> 使用指定的列隊
-f<檔案> 從指定檔案讀入任務而不是從标準輸入讀入
-t<時間參數> 以時間參數的形式送出要運作的任務
示例:
[root@entel2 ~]# at -v
Garbled time
[root@entel2 ~]# at -V
at version 3.1.10
複制
time 詳解:
time 可以是 1,2或者4位數字,以時分形式(HHMM或者HH:MM)指定作業開始運作的時間
如果指定的時間為整點時間(1或者2位數字),分可以省略
如果按12小時指定時間,時間後面應該加am或者pm
其他可以接受的關鍵字是midnight 、noon 和 now
能夠使用相對計時法。指定格式為:now + count time-units ,now就是目前時間,time-units是時間機關,這裡能夠是minutes(分鐘)、hours(小時)、days(天)、weeks(星期)。count是時間的數量,幾天,幾小時。
date 詳解:
date是以月 日 年(MMDDYY、MM/DD/YY或者MM.DD.YY)
“月名 日 (如 June 1)”、星期幾(如Monday)、關鍵字today或者tomorrow等辨別的日期
為了簡化輸入,也可以使用月,星期幾或者其他關鍵字的前三個字元
通常,任何使用者都可以建立 顯示 删除自己的at作業檔案,但隻有root使用者才有權限通路其他使用者的at作業。
當利用at或者batch送出at作業後,系統會以檔案的形式儲存送出的at作業,并存儲在 /var/spool/cron/atjobs目錄中,由cron守護程序負責處理at或者batch指令形式送出的作業
at作業檔案采用一串數字加一個.a 或者.b擴充名命名。
數字表示作業在at作業隊列中的位置
檔案名字尾表示作業類型,
a表示at送出的作業 b表示batch指令送出的作業
栗子
送出at作業
送出at作業三要素:
- 輸入at指令
- 指定作業執行時間
- 輸入準備執行的指令或者shell腳本
為了送出一個at作業步驟:
- 輸入at指令同時指定作業執行的時間 ,按下Enter鍵;
- 在at指令提示符“at >”下,輸入指令或者shell腳本
- Ctrl+D 送出at作業。
在16點48分執行 pwd 和 ls 指令
[root@entel2 cron]# at 1648
at> pwd&&ls
job 2 at 2016-10-15 16:48
複制
執行日志 在 /var/spool/mail/root檔案中
如果希望同時輸入多個指令或者shell腳本,每個指令或者shell腳本應該占一行,以Enter鍵結束,按下Ctrl-D送出作業。
[root@entel2 cron]# at 1715
at> pwd
at> ll
at>
at>
job 4 at 2016-10-15 17:15
[root@entel2 cron]# atq
4 2016-10-15 17:15 a root
1 2016-10-15 16:50 a root
複制
送出batch作業
當需要送出一個作業而不關系其究竟何時執行時,可以使用batch指令。batch不需要指定時間,因為它會自動在系統負載比較低的時候執行(平均負載小于0.8的時候)
[root@entel2 cron]# batch
at> date
job 5 at 2016-10-15 17:42
複制
顯示at作業及作業隊列
查詢已經建立,目前仍然在at隊列中的作業,可以直接通路/var/spool/cron/atjobs目錄 (可能沒有該目錄哦~)
或者
atq
或者
at -l
[root@entel2 ~]# atq
1 2016-10-15 16:50 a root
5 2016-10-15 17:42 b root
[root@entel2 ~]# at -l
1 2016-10-15 16:50 a root
5 2016-10-15 17:42 b root
複制
顯示已經設定的任務内容
指令:
at -c 任務号
複制
[root@entel2 /]# at tomorrow
at> ls
job 7 at 2016-10-16 18:35
[root@entel2 /]# atq
7 2016-10-16 18:35 a root
[root@entel2 /]# at -c 7 #看倒數第二行
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
HOSTNAME=entel2; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
......省略
}
${SHELL:-/bin/sh} << 'marcinDELIMITER6e198d77'
ls
marcinDELIMITER6e198d77
複制
三部分
- 第一部分:完成後是否電郵通知使用者等
- 第二部分:主要是環境變量設定
- 第三部分:需要執行的實際指令
删除at作業
使用atrm指令可以将已添加的未執行計劃任務删除,格式為“atrm 任務号”比如:
atrm 5
或者
atrm 檔案名
或者使用atrm的别名
at -d 任務号
at -d 檔案名
[root@entel2 /]# atq #查詢
1 2016-10-15 16:50 a root
5 2016-10-15 17:42 b root
[root@entel2 /]# atrm 5 #删除任務号為5的job
[root@entel2 /]# atq #查詢
1 2016-10-15 16:50 a root
複制
任何使用者都可以從隊列中删除自己的at作業
隻有root使用者才能删除其他使用者的at作業
root 如果未指定使用者名,則删除自己的at作業。
at指令的通路控制
at指令使用的控制檔案來限制使用者的使用控制
控制檔案目錄:
/etc/at.allow
和
/etc/at.deny
(隻有root使用者才可以通路)
控制檔案使用規則:
-
1:先找尋 /etc/at.allow 這個檔案,寫在這個檔案中的使用者才能使用 at ,沒有在這個檔案中的使用者則不能使用 at
(即使沒有寫在 at.deny 當中);
- 2:如果 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個檔案,若寫在這個 at.deny 的使用者則不能使用at ,而沒有在這個 at.deny 檔案中的使用者就可以使用 at 指令。 Unix通常不提供at.allow檔案
- 3:如果兩個檔案都不存在,那麼隻有 root 可以使用 at 這個指令。
-
4:在一般的 distributions 當中,由于假設系統上的所有使用者都是可信任的, 是以系統通常會保留一個空的
/etc/at.deny 檔案,意思是允許所有人使用 at 指令的意思。
- 5:如果不希望有某些使用者使用 at 的話,将那個使用者的帳号寫入 /etc/at.deny 即可! 一個帳号寫一行。
# vi /etc/at.allow
複制
注意事項
1、如果at的指令輸出的路徑有誤 則會把結果以郵件的形式發送給使用者
2、當一個任務建立了會被配置設定到一個任務号,而且會在/var/spool/at裡面排隊。不建議使用vi編輯器去修改,容易出錯。
執行個體:系統定時關機
# at 1430
at> init 0
at>
.........
複制