Linux 伺服器系統管理第七章 行程管理  上一頁    下一頁

7-5 週期性行程

內容:

7-5-1 週期性服務 - crond

所謂『週期性行程』(稱之 cron,就是在設定特定的週期性時間,執行某一批次命令,並以行程稱之。所謂『週期性時間』,表示週期性並重複出現的時間,譬如每天下午 3 點整、每星期六的下午 5 點整、或每月的 15 日上午 10: 30 等等皆是。設定週期性行程對於自動化管理非常有幫助,我們可以請系統在週期性特定時間,去執行某些例行性的任務,或監視某一共享資源等等。首先須觀察 crond 服務程式是否啟動,如下:(執行 #systemctl status|stop|start crond 命令)

#  systemctl  status  crond   [執行命令]

crond.service - Command Scheduler

   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)

   Active: active (running) since 2017-02-07 08:48:43 CST; 7min ago

 Main PID: 994 (crond)

   CGroup: /system.slice/crond.service

           └─994 /usr/sbin/crond -n

7-5-2 cron 相關檔案

      與 cron 相關的有下列檔案,並依照其功能分別說明之,如下:

  • /etc/cron.d/:使用者建立的 crontab 檔案儲存目錄。

  • /etc/cron.daily/:系統每日執行行程的儲存目錄。

  • /etc/cron.hourly/:系統每小時執行的儲存目錄。

  • /etc/monthly/:系統每月執行的儲存目錄。

  • /etc/weekly/:系統每周執行的儲存目錄

  • /etc/cron.allow/etc/cron.deny:授權使用者操作 cron

  • /etc/cronttabcrontab 示範格式。

  • /var/spool/cron/cron 排序。

如同 at 命令一樣,cron 也是利用 allow deny/etc/cron.allow /etc/cron.deny)兩檔案來規劃哪些使用者可以設定 cron。編輯 cron.allow 範例如下:(root 管理者)

# cat /etc/cron.allow

tsnien

nien

上述範例表示,僅 tsnien nien 使用者可以使用 cron 命令,其他未列入的使用者則沒有權限設定 cron

7-5-3 週期執行表格 - crontab

cron 是利用建立一個 crontab 表格來規劃哪一個週期時間,應該執行何種命令,建立的方法可利用 vi 編輯,也可直接利用 crontab 命令操作。以系統所提供 /etc/crontab 為例,來說明其格式:(執行 # cat /etc/crontab 命令)

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

# For details see man 4 crontabs

# Example of job definition:

# .---------------- minute (0 - 59)

# |  .------------- hour (0 - 23)

# |  |  .---------- day of month (1 - 31)

# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

# |  |  |  |  |

# *  *  *  *  * user-name  command to be executed

前面四行為設定 cron 的執行環境,其中若每行的最前面是井號(#)的話,表示該行為註解說明。接下來,每一行表示一項定期執行的工作,它有 6 個欄位,每個欄位功能如下(未指定內容以 * 號表示):

  • 第一欄位:表示分鐘,從 00 59

  • 第二欄位:表示點(時)鐘,從 01 24

  • 第三欄位:表示日,從 01 31

  • 第四欄位:表示月,從 01 12

  • 第五欄位:表示星期,從 0 6,其中 0 為星期日。

  • 第六欄位:執行命令。

每一行表示一個週期性行程,共有 6 個欄位,之間以空格區分。欄位內特殊符號有:

  • *(星號):代表任何時刻都接受。

  • ,(逗號):表可接受多個時間,譬如分鐘是 15, 30, 45,則15 分、30分與 45 分都接受。

  • -(減號):表示時間區段,譬如日期是 2-10,則表示2 10 之間每天都接受。

  • /n(斜線):表示每隔 n,譬如分鐘是 */5,則表示每隔 5 分鐘。

7-5-4 建立週期命令 - crontab

建立與操作 cron 表格,係利用 crontab 命令來達成,格式如下:

$ crontab [ -u user ] file

$ crontab [ -u user ] { -l | -r | -e }

常用選項如下:

  • -u user:指定某一使用者的 crontab 表格,一般都是由系統管理者設定。

  • file:直接導入 crontab 檔案。

  • -l :列出使用者在 crontab 所設定的定期命令。

  • -r :刪除 crontab 命令。

  • -e :直接進入 vi 編輯 /etc/crontab 檔案。

執行 $ crontab –e 之後,會立即進入 vi 編輯模式,並自動編輯使用者的 cron 表格,輸入內容後直接儲存並離開,且不要指定檔案名稱。操作範例如下:(以 tsnien 名稱登入並執行 $ crontab  -e,進入 vi 模式下編輯)

# Test cron of tsnien

1 23 1,15 * * fsck /home

1,30 * * * * quota –a

7-5-5 建立 crontab 範例

假設我們希望系統能週期性的執行下列工作:

  • 每個月的 1 15 ,針對 /home 做檔案系統檢查一次。

  • 30 分鐘檢查一次所有使用者的配額是否有溢滿。

(A) 建立crontab

執行 $ crontab –e 之後,會立即進入 vi 編輯模式,並自動編輯使用者的 cron 表格,輸入內容後直接儲存並離開,且不要指定檔案名稱。操作範例如下:(以 tsnien 名稱登入並執行 $ crontab  -e,進入 vi 模式下編輯)

# Test cron of tsnien

1 23 1,15 * * fsck /home

1,30 * * * * quota –a

第一行為每月 1 15 日的 23:01 時執行 fsck /home 命令;第二行為每小時的 1 30 分時執行 quota -a。值得注意的是,兩個都是系統管理命令,所以tsnien 必須是 root 群組的成員才可以操作。儲存並離開後,可觀察是否建立成功,操作範例如下($ crontab -l):

$ crontab  -l

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (/tmp/crontab.4838 installed on Mon Oct 10 10:09:03 2005)

# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

# Test cron of tsnien

1 23 1,15 * * fsck /home

1,30 * * * * quota –l

 

(B) crontab 表格儲存

每一個使用者僅能建立一個 cron 表格,第一次建立時系統會將其儲存於 /var/spool/cron/ 目錄下,並以使用者名稱(如 tsnien)儲存。如果使用者欲修改其內容,則需再執行 crontab –e 命令,系統就會將原使用者的表格再叫出來編輯。接下來,觀察剛才 tsnien 所建立的表格:(需具 root 權限)

# cat  /var/spool/cron/tsnien

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# Test cron of tsnien

1 23 1,15 * * fsck /home

1,30 * * * * quota -l

7-5-6 檔案導入與刪除

(A) 檔案導入

我們也可以先利用 vi(或其他編輯工具)建立一個 cron 檔案,再將其導入成 cron 表格;假設期望建立的週期性工作如下:

  • 每天 09:30 時執行 who > who.day 命令一次。

  • 每星期一的 17:30 執行 ps –ef > ps.week 命令一次。

則可利用 vi 編輯$ vi cron_1,檔案內容如下:

$ cat  cron_1       [觀察 cron_1 檔案內容]

# file input cron table

# file name: cron_1

30 09 * * * who >who.day

30 17 * * 1 ps -ef >ps.week

接下來,再將 cron_1 導入 cron 表格內,操作範例如下($crontab  cron_1):

$ crontab  cron_1             [載入 cron_1 ]

$ crontab  -l                 [觀察 crontab 內容]

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# file input cron table

# file name: cron_1

30 09 * * * who >who.day

30 17 * * 1 ps -ef >ps.week

不過有一點必須特別注意,假使先前已經建立過 cron 表格,而且仍存在系統,此時再導入其他 cron 檔案時,就會將原來的 cron 表格覆蓋,並以新表格取代之。

(B) 刪除 crontab

使用者也可以刪除自己的 cron 表格(crontab -r),操作範例如下:

$ crontab  -r           [刪除]

$ crontab  -l           [觀察crontab內容]

no crontab for tsnien

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: