天天看點

Linux中的計劃任務—Crontab排程一次性執行的任務at/batch概述服務啟動文法栗子

概述

前不久我們梳理了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作業步驟:

  1. 輸入at指令同時指定作業執行的時間 ,按下Enter鍵;
  2. 在at指令提示符“at >”下,輸入指令或者shell腳本
  3. Ctrl+D 送出at作業。
Linux中的計劃任務—Crontab排程一次性執行的任務at/batch概述服務啟動文法栗子

在16點48分執行 pwd 和 ls 指令

[root@entel2 cron]# at 1648
at> pwd&&ls
job 2 at 2016-10-15 16:48           

複制

執行日志 在 /var/spool/mail/root檔案中

Linux中的計劃任務—Crontab排程一次性執行的任務at/batch概述服務啟動文法栗子

如果希望同時輸入多個指令或者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> 
.........           

複制