天天看點

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業

Linux 技巧: 用 cron 和 at 排程作業

如何輕松地管理系統
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
文檔選項
&lt;tr valign=&quot;top&quot;&gt;&lt;td width=&quot;8&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;1&quot; width=&quot;8&quot; src=&quot;//www.ibm.com/i/c.gif&quot;/&gt;&lt;/td&gt;&lt;td width=&quot;16&quot;&gt;&lt;img alt=&quot;&quot; width=&quot;16&quot; height=&quot;16&quot; src=&quot;//www.ibm.com/i/c.gif&quot;/&gt;&lt;/td&gt;&lt;td class=&quot;small&quot; width=&quot;122&quot;&gt;&lt;p&gt;&lt;span class=&quot;ast&quot;&gt;未顯示需要 JavaScript 的文檔選項&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; <script type="text/javascript" language="JavaScript"> </script>
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
列印本頁
<script type="text/javascript" language="JavaScript"> </script>
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
将此頁作為電子郵件發送
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
讨論

級别: 中級

Ian Shields ([email protected]), 進階程式員, IBM 

2007 年 8 月 27 日

系統管理者需要在系統負載低的午夜運作作業,或者需要每天或每月運作作業,同時又不願意犧牲睡眠時間或假期。排程任務的其他原因包括自動執行日常任務或者確定每次都以相同的方式處理任務。本文幫助您使用

cron

at

功能排程作業定期運作或在指定的時間運作一次。

Linux® 和 UNIX® 系統允許排程任務在以後執行一次,或者重複運作。本文是從 developerWorks 教程 “LPI 102 考試準備:管理任務” 摘錄的,講解如何排程作業定期運作,或在指定的時間運作一次。

在 Linux 系統上,許多管理任務必須頻繁地定期執行。這些任務包括輪轉日志檔案以避免裝滿檔案系統、備份資料和連接配接時間伺服器來執行系統時間同步。上面提到的教程更詳細地介紹了這些管理任務。在本文中,學習 Linux 中提供的排程機制,包括

cron

anacron

設施以及

crontab

at

指令。即使系統常常關機,

anacron

也可以幫助排程作業。

以一定的時間間隔運作作業

以一定的時間間隔運作作業需要使用 cron 設施進行管理,它由

crond

守護程序和一組表(描述執行哪些操作和采用什麼樣的頻率)組成。這個守護程序每分鐘喚醒一次,并通過檢查 crontab 判斷需要做什麼。使用者使用

crontab

指令管理 crontab。

crond

守護程序常常是在系統啟動時由 init 程序啟動的。

為了簡單,假設希望定期運作清單 1 所示的指令。這個指令實際上隻報告日期和時間,其他什麼事都不做,但是它可以說明如何使用

crontab

設定 cron 作業,而且還可以通過輸出看到作業運作的時間。設定 crontab 條目需要一個包含轉義的 shell 元字元的字元串,是以适合于簡單的指令和參數。在這個示例中,将從腳本 /home/ian/mycrontab.sh 運作

echo

指令,這個腳本不需要參數。 這可以減少處理轉義字元的工作。

清單 1. 一個簡單的指令示例

[[email protected] ~]$ cat mycrontest.sh
#!/bin/bash
 echo "It is now $(date +%T) on $(date +%A)"
[[email protected] ~]$ ./mycrontest.sh
It is now 18:37:42 on Friday
      

建立 crontab

使用

crontab

指令和

-e

(表示 “edit”)選項建立 crontab。這會打開

vi

編輯器,除非在 EDITOR 或 VISUAL 環境變量中指定了另一種編輯器。

每個 crontab 條目包含六個字段:

  1. 分鐘
  2. 小時
  3. 星期
  4. sh

    執行的字元串

分鐘和小時的範圍分别是 0-59 和 0-12,日和月的範圍分别是 1-31 和 1-12。星期的範圍是 0-6,0 表示星期日。星期也可以指定為 sun、mon、tue 等等。第 6 個字段包含前 5 個字段之後的所有内容,它是要傳遞給

sh

的字元串。百分号(%)将轉換為空行,是以如果要使用 % 或其他任何特殊字元,就要在前面加上反斜線(/)。第一個 % 之前的一行傳遞給 shell,這個 % 之後的所有行都作為标準輸入傳遞。

各個與時間相關的字段可以指定一個單獨的值、值的範圍(比如 0-10 或 sun-wed)或者以逗号分隔的單獨值和範圍清單。清單 2 給出一個 crontab 條目示例。

清單 2. 一個簡單的 crontab 示例

0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
      

在這個示例中,我們的指令在 7 月的每個星期五和星期六晚上 10 點到午夜之間的第 0、20、40 分鐘(每 20 分鐘)執行。關于指定時間的其他方式的細節,參見 crontab(5) 的手冊頁。

輸出

您可能想知道對來自指令的輸出會如何處理。為使用 cron 而設計的大多數指令會使用 syslog 在日志中記錄輸出(參見教程 “LPI 102 考試準備:管理任務” 中的讨論)。但是,定向到 stdout 的輸出會通過電子郵件發送給使用者。清單 3 給出我們的指令示例可能産生的輸出。

清單 3. 通過電子郵件發送的 cron 輸出

From [email protected]  Fri Jul  6 23:00:02 2007
Date: Fri, 6 Jul 2007 23:00:01 -0400
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <[email protected]> /home/ian/mycrontest.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/ian>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=ian>
X-Cron-Env: <USER=ian>

It is now 23:00:01 on Friday

      

crontab 存儲在哪裡?

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業

suid 程式

suid 程式以程式檔案的所有者的權限運作,而不是采用運作程式的使用者的權限。關于

suid

的更多資訊,參見教程 “LPI 101 考試準備:裝置、Linux 檔案系統和 Filesystem Hierarchy Standard”;關于

passwd

指令的更多資訊,參見教程 “LPI 102 考試準備:管理任務”。

crontab

指令建立的 crontab 存儲在 /etc/spool/cron 下面的一個子目錄中,這個子目錄與建立 crontab 的使用者同名,是以上面的 crontab 存儲在 /etc/spool/cron/ian 中。是以,與

passwd

指令一樣,

crontab

指令是一個用根權限運作的 suid 程式。

/etc/crontab

除了 /var/spool/cron 中的使用者 crontab 檔案之外,

cron

還會檢查 /etc/crontab 檔案和 /etc/cron.d 目錄中的檔案。在這些系統 crontab 中,在第五個時間字段(星期)和指令之間增加了一個字段。這個字段指定哪個使用者應該運作這個指令,一般情況下是根使用者。清單 4 給出一個 /etc/crontab 檔案示例。

清單 4. /etc/crontab

在這個示例中,真正的工作由

run-parts

指令執行,它運作 /etc/cron.hourly、/etc/cron.daily 等目錄中的腳本;/etc/crontab 僅僅控制執行作業的時間。注意,這裡的所有指令都作為根使用者運作。還要注意,crontab 可以包含 shell 變量指派,這些指派會在運作指令之前執行。

anacron

cron 适合那些連續運作的系統。對于那些常常不開機的系統,比如筆記型電腦,可以使用另一個實用程式 anacron(表示 “anachronistic cron”)排程每日、每周或每月執行的作業。anacron 不處理每小時執行的作業。

anacron 在 /var/spool/anacron 中保留時間戳檔案,記錄作業運作的時間。當 anacron 運作時,它檢查自作業上一次運作以來是否已經經過了所需的天數,如果需要,就運作作業。anacron 的作業表存儲在 /etc/anacrontab 中,檔案格式與 /etc/crontab 略有不同。與 /etc/crontab 一樣,/etc/anacrontab 可以包含環境設定。每個作業有四個字段:

  1. 周期
  2. 延遲
  3. 作業辨別符
  4. 指令

周 期是天數,但是可以指定為 @monthly,這確定作業每個月隻運作一次(無論這個月中有多少天)。延遲是在作業符合運作條件之後,到實際啟動它之前等待的分鐘數。可以使用這個設 置防止在系統啟動時集中執行作業。作業辨別符可以包含除了斜線(/)之外的所有非空白字元。

/etc/crontab 和 /etc/anacrontab 都通過直接編輯進行更新。不使用

crontab

指令更新這些檔案或 /etc/cron.d 目錄中的檔案。

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
回頁首

在指定的時間運作作業

有時候,需要隻運作作業一次而不是定期運作。為此,應該使用

at

指令。要運作的指令是從

-f

選項指定的檔案讀取的,如果沒有使用

-f

,那麼從 stdin 讀取。

-m

選項向使用者發送郵件,即使指令沒有 stdout。

-v

選項顯示運作作業的時間。這個時間也顯示在輸出中。

清單 5 給出一個運作

mycrontest.sh

腳本的示例。清單 6 顯示在運作作業之後通過郵件發送給使用者的輸出。注意,這裡的輸出比對應的 cron 作業輸出要簡單一些。

清單 5. 使用 at 指令

[[email protected] ~]$ at -f mycrontest.sh -v 10:25
Sat Jul  7 10:25:00 2007

job 5 at Sat Jul  7 10:25:00 2007
      

清單 6. 來自 at 的作業輸出

From [email protected]  Sat Jul  7 10:25:00 2007
Date: Sat, 7 Jul 2007 10:25:00 -0400
From: Ian Shields <[email protected].ibm.com>
Subject: Output from your job        5
To: [email protected]

It is now 10:25:00 on Saturday

      

時間的設定可以非常複雜。清單 7 給出幾個示例。參見

at

的手冊頁、/usr/share/doc/at/timespec 檔案或 /usr/share/doc/at-3.1.10/timespec 這樣的檔案(這個示例中的 3.1.10 是

at

包的版本号)。

清單 7. at 指令使用的時間值

[[email protected] ~]$ at -f mycrontest.sh  10pm tomorrow
job 14 at Sun Jul  8 22:00:00 2007
[[email protected] ~]$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007
[[email protected] ~]$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007
[[email protected] ~]$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007
      
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
nice 值

nice

值表示一個作業對于其他使用者的優先程度。關于

nice

renice

指令的更多資訊,參見教程 “LPI 101 考試準備:GNU 和 UNIX 指令”。

at

指令還有一個

-q

選項。随着隊列的增長,作業的

nice

值也會增長。 還有一個

batch

指令,它與

at

指令相似,但是作業隻在系統負載足夠低時運作。這些特性的細節參見手冊頁。

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
回頁首

管理排程的作業

列出排程的作業

可以管理 cron 和 at 作業。使用

crontab

指令和

-l

選項列出 crontab,使用

atq

指令顯示用

at

指令加入隊列中的作業,見清單 8。

清單 8. 顯示排程的作業

[[email protected] ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[[email protected] ~]$ atq
16      Wed Jul 11 02:00:00 2007 a ian
17      Sat Jul 14 02:00:00 2007 a ian
14      Sun Jul  8 22:00:00 2007 a ian
15      Tue Jul 10 02:00:00 2007 a ian
      

如果希望檢視

at

排程執行的實際指令,那麼可以使用

at

指令并加上

-c

選項和作業号。您會注意到,在發出

at

指令時生效的大多數環境設定會随排程的作業一起儲存。清單 9 給出清單 7 和清單 8 中作業 15 的部分輸出。

清單 9. 使用 at -c 并加上作業号

#!/bin/sh
# atrun uid=500 gid=500
# mail ian 0
umask 2
HOSTNAME=lyrebird.raleigh.ibm.com; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=9.67.219.151/ 3210/ 22; export SSH_CLIENT
SSH_TTY=/dev/pts/5; export SSH_TTY
USER=ian; export USER
 ...
HOME=/home/ian; export HOME
LOGNAME=ian; export LOGNAME
 ...
cd /home/ian || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
${SHELL:-/bin/sh} << `(dd if=/dev/urandom count=200 bs=1 /
   2>/dev/null|LC_ALL=C tr -d -c '[:alnum:]')`

#!/bin/bash
 echo "It is now $(date +%T) on $(date +%A)"
      

注意,我們腳本檔案的内容已經複制在一個 here-document 中,這個 here-document 将由 SHELL 變量指定的 shell 執行(如果沒有設定 SHELL 變量,就使用 /bin/sh)。關于 here-document 的資訊參見教程 “LPI 101 考試準備,主題 103:GNU 和 UNIX 指令”。

删除排程的作業

可以使用

cron

指令和

-r

選項删除所有排程的 cron 作業,見清單 10。

清單 10. 顯示并删除 cron 作業

[[email protected] ~]$ crontab -l
0,20,40 22-23 * 7 fri-sat /home/ian/mycrontest.sh
[[email protected] ~]$ crontab -r
[[email protected] ~]$ crontab -l
no crontab for ian
      

要删除系統 cron 或 anacron 作業,應該編輯 /etc/crontab、/etc/anacrontab 或者編輯或删除 /etc/cron.d 目錄中的檔案。

可以使用

atrm

指令加作業号删除用

at

指令排程的一個或多個作業。多個作業應該用空白分隔。清單 11 給出一個示例。

清單 11. 用 atq 和 atrm 顯示并删除作業

[[email protected] ~]$ atq
16      Wed Jul 11 02:00:00 2007 a ian
17      Sat Jul 14 02:00:00 2007 a ian
14      Sun Jul  8 22:00:00 2007 a ian
15      Tue Jul 10 02:00:00 2007 a ian
[[email protected] ~]$ atrm 16 14 15
[[email protected] ~]$ atq
17      Sat Jul 14 02:00:00 2007 a ian
      
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
回頁首

配置使用者對作業排程的通路

如果檔案 /etc/cron.allow 存在,那麼非根使用者必須在其中列出,才能使用

crontab

和 cron 設施。如果 /etc/cron.allow 不存在,但是 /etc/cron.deny 存在,那麼其中列出的非根使用者不能使用

crontab

或 cron 設施。如果這兩個檔案都不存在,那麼隻允許超級使用者使用這個指令。空的 /etc/cron.deny 檔案允許所有使用者使用 cron 設施,這是預設情況。

/etc/at.allow 和 /etc/at.deny 檔案對 at 設施起相似的作用。

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
回頁首

了解更多資訊

Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
分享這篇文章……
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
将這篇文章送出到 Digg
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業
釋出到 del.icio.us
Linux 技巧: 用 cron 和 at 排程作業Linux 技巧: 用 cron 和 at 排程作業

繼續閱讀