Linux & Unix shell 編程指南之cron命令

來源:互聯網
上載者:User

 

1 後台執行命令

cron :系統調度進程。可以使用它在每天的非高峰負荷時間段運行作業,或在一周或一月中的不同時段運行。
At at :命令。使用它在一個特定的時間運行一些特殊的作業,或在晚一些的非負荷高峰時間段或高峰負荷時間段運行。
&     :使用它在後台運行一個佔用時間不長的進程。
Nohup :使用它在後台運行一個命令,即使在使用者退出時也不受影響。

2 cron和crontab

cron 是系統主要的調度進程,可以在無需人工幹預的情況下運行作業。
有個 crontab 命令允許使用者提交、編輯或刪除相應的作業。
每一個使用者都可以有一個 crontab 檔案來儲存調度資訊。可以使用它運行任意一個shell指令碼或某個命令,每小時運行一次,或一周三次,這完全取決於你。
每一個使用者都可以有自己的 crontab 檔案,但在一個較大的系統中,系統管理員一般會禁止這些檔案,而只在整個系統保留一個這樣的檔案。系統管理員是通過 cron.deny
和 cron.allow 這兩個檔案來禁止或允許使用者擁有自己的 crontab檔案。

2.1 crontab的域
為了能夠在特定的時間運行作業,需要瞭解 crontab檔案每個條目中各個域的意義和格式。

第1列 分鐘 0~59
第2列 小時 0~23(0表示子夜)
第3列 日   1~31
第4列 月   1~12
第5列 星期 0~6(0表示星期天)
第6列 年 1970~2099可選
第7列 要啟動並執行命令

 

*     *     *     *     *     *     command to be executed
_    _    _     _    _    _ 

 |     |     |       |     |     |
 |     |     |       |     |     +----- year (1970-2099) (optional, if not be used, you can keep blank)
 |     |     |       |    +----- day of week (0 - 6) (Sunday=0)
 |     |     |      +------- month (1 - 12)
 |     |     +--------- day of month (1 - 31)
 |     +----------- hour (0 - 23)
+------------- min (0 - 59)
如果某一項設定了多個參數,可以用“,”隔開,例如3,4,5,6這樣。
如果是幾個連續的數字構成的參數,可以用用“-”吧首尾相連,例如3-6。

crontab 的格式如下:
分< >時< >日< >月< >星期< >要啟動並執行命令,其中< >表示空格。
Crontab 檔案的一個條目是從左邊讀起的,第一列是分,最後一列是要啟動並執行命令,它位於星期的後面。
在這些域中,可以用橫杠 "-" 來表示一個時間範圍,例如希望星期一至星期五運行某個作業,那麼可以在星期域使用 1-5來表示。還可以在這些域中使用逗號 "," ,例如希望星期一和星期四運行某個作業,只需要使用 1,4 來表示。可以用星號 * 來表示連續的時間段。如果你對某個表示時間的域沒有特別的限定,也應該在該域填入 * 。該檔案的每一個條目必須含有5個時間域,而且每個域之間要用空格分隔。該檔案中所有的注釋行要在行首用 # 來表示。

crontab 檔案條目 例子:
30 21* * * /apps/bin/cleanup.sh
上面的例子表示每晚的21:30 運行 /apps/bin目錄下的 cleanup.sh。
45 4 1,10,22 * * /apps/bin/backup.sh
上面的例子表示每月1、1 0、2 2日的 4:45 運行 /apps/bin目錄下的backup.sh。
10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;
上面的例子表示每周六、周日的1:10運行一個find命令。
0,30 18-23 * * * /apps/bin/dbcheck.sh
上面的例子表示在每天 18:00至23:00之間每隔30分鐘運行 /apps/bin目錄下的 dbcheck.sh。
0 23 * * 6 /apps/bin/qtrend.sh
上面的例子表示每星期六的11:00pm運行 /apps/bin目錄下的 qtrend.sh。

上面例子中,每個命令都給出了絕對路徑。當使用 crontab 運行 shell 指令碼時,使用者要給出指令碼的絕對路徑,設定相應的環境變數。記住,既然是使用者向 cron提交了這些作業,就要向 cron 提供所需的全部環境。不要假定 cron 知道所需要的特殊環境,它其實並不知道。
所以要保證在 shell 指令碼中提供所有必要的路徑和環境變數,除了一些自動化佈建的全域變數。
如果 cron 不能運行相應的指令碼,使用者將會收到一個郵件說明其中的原因。

2.2 crontab命令選項
crontab 命令的一般形式為:
Crontab [-u user] -e -l -r
其中:
-u 使用者名稱。
-e 編輯 crontab 檔案。
-l 列出 crontab 檔案中的內容。
-r 刪除 crontab 檔案。
如果使用自己的名字登入,就不用使用 -u選項,因為在執行 crontab 命令時,該命令能夠知道當前的使用者。

2.3 建立一個新的 crontab 檔案
在向 cron 進程提交一個 crontab 檔案之前,首先要做的一件事情就是設定環境變數EDITOR。
cron 進程根據它來確定使用哪個編輯器編輯 crontab 檔案。99% 的UNIX和LINUX使用者使用vi,如果你也是這樣,那麼你就編輯 $HOME目錄下的 .profile 檔案,在其中加入這樣一行:
EDITOR=vi; export EDITOR
然後儲存並退出。
不妨建立一個名為 <user>cron 的檔案,其中<user>是使用者名稱,如lanseyokeycron。
首先建立一個s hell 檔案如 time.sh
echo "Now time is:"
date
然後開啟檔案 lanseyokeucron 加入如下的內容:
# echo the date to the console every
# 15 minutes between 6am and 6pm on Sunday
0,15,30,45 06-18 * * 0 /lanseyokey/time.sh
儲存並退出,確信前面5個域用空格分隔。
在上面的例子中,系統將每隔 15 分鐘輸出一次目前時間。如果系統崩潰或掛起,從最後所顯示的時間就可以一眼看出系統是什麼時間停止工作的。

為了提交剛剛建立的 crontab 檔案,可以把這個新建立的檔案作為 cron 命令的參數:
$ crontab lanseyokeycron
現在該檔案已經提交給 cron 進程,它將每隔 15 分鐘運行一次。
同時,新建立檔案的一個副本已經被放在 /var/spool/cron 目錄中,檔案名稱就是使用者名稱(即,lanseyokey)。

2.4 列出crontab檔案
為了列出 crontab 檔案,可以用:
$ cron -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (lanseyokeycron installed on Sun Dec 20 11:28:00 2009)
# (Cron vesion -- $Id: crontab.c.v 2.13 1994/01/17 04:20:37 vixie Exp $)
# echo the date to the console every
# 15 minutes between 6am and 6pm on Sunday
0,15,30,45 06-18 * * 0 /lanseyokey/time.sh
注意:若是以lanseyokey使用者名稱登入則不需使用 -u 選項,否則使用
$ crontab -u lanseyokey -l
可以使用這種方法在 $HOME 目錄中對 crontab 檔案做一備份:
$ crontab -l > $HOME/mycron

2.5 編輯 crontab 檔案
如果希望添加、刪除或編輯 crontab 檔案中的條目,而 EDITOR環境變數又設定為 vi,那麼就可以用 vi 來編輯 crontab 檔案,相應的命令為:
$ crontab -e
可以像使用 vi 編輯其他任何檔案那樣修改 crontab 檔案並退出。如果修改了某些條目或添加了新的條目,那麼在儲存該檔案時, cron 會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許範圍的值,它會提示你。
在編輯 crontab 檔案時,沒準會加入新的條目。例如,加入下面的一條:
# echo greeting to user
0 06-18 * * * /bin/echo "Hello, Welcome to Linux"
儲存並退出。最好在 crontab 檔案的每一個條目之上加入一條注釋,這樣就可以知道它的功能、已耗用時間,更為重要的是,知道這是哪位使用者的作業。
現在讓我們使用前面講過的crontab -l命令列出它的全部資訊:
$ cron -u lanseyokey -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (lanseyokeycron installed on Sun Dec 20 11:28:00 2009)
# (Cron vesion -- $Id: crontab.c.v 2.13 1994/01/17 04:20:37 vixie Exp $)
# echo the date to the console every
# 15 minutes between 6am and 6pm on Sunday
0,15,30,45 06-18 * * 0 /lanseyokey/time.sh
# echo greeting to user
0 06-18 * * * /bin/echo "Hello, Welcome to Linux"

刪除 crontab 檔案,可以用:
$ crontab -r
恢複丟失的 crontab 檔案如果不小心誤刪了 crontab 檔案,假設你在自己的 $HOME 目錄下還有一個備份,那麼可以將其拷貝到 /var/spool/cron/<username>,其中<username>是使用者名稱。
如果由於許可權問題無法完成拷貝,可以用:
$ crontab <filename>
其中,<filename> 是你在 $HOME 目錄中副本的檔案名稱。

建議在自己的 $HOME 目錄中儲存一個該檔案的副本,因為r鍵緊挨在e鍵的右邊,很容易誤刪。
有些系統文檔建議不要直接編輯 crontab 檔案,而是編輯該檔案的一個副本,然後重新提交新的檔案。有些 crontab 的變體有些怪異,所以在使用 crontab 命令時要格外小心。
如果遺漏了任何選項,crontab 可能會開啟一個空檔案,或者看起來像是個空檔案,這時敲delete 鍵退出,不要按<Ctrl-D>,否則將丟失 crontab 檔案。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.