任務計劃at,crontab 的使用

在Linux中,可以使用at功能調度任務在指定的時間運行一次,或使用crontab功能調度作業定期運行。


1. 一次性執行命令: at [-f file] [-mldvc] TIME

有時候,需要只運行某任務一次而不是定期運行。爲此,應該使用at命令。

1.1 at的常用選項:

-f file: 可以運行從指定的文件讀取的命令
-m:  執行結果以郵件方式發送給任務發起者
-l: at -l 相當於atq, 列出系統所有at任務
-d JOB_ID:at -d 相當於atrm, 刪除尚未執行的任務
-v: 顯示運行作業的時間
-c JOB_ID : 將任務內容顯示到屏幕


1.2 TIME:時間格式

at now+5min --從現在開始後5分鐘後執行
at 11:30 2014-01-01 --在2014年1月1日11:30 執行
at noon, midnight, teatime --在中午12點,夜晚12點,下午茶時間(4點) 執行


1.3 at命令使用

當執行at TIME 命令是會進入所謂的at shell環境,可輸入多重命令等待執行,以Ctrl+d結束,會出現<EOT>字樣。

例如,在5分鐘後重啓系統
# at now+5min
at> /bin/sync
at> /bin/sync
at> /sbin/reboot -h now
at> <EOT>
job 3 at 2014-01-03 05:19


2. 週期性執行命令:crontab

以一定的時間間隔運行任務需要使用cron服務進行管理,它由crond守護進程和一組表(描述執行哪些操作和採用什麼樣的頻率)組成。這個守護進程每分鐘喚醒一次,並通過檢查 crontab 判斷需要做什麼。用戶使用crontab命令管理 crontab。crond守護進程常常是在系統啓動時由 init 進程啓動的。

而linux任務調度的工作主要分爲以下兩類:
系統執行的工作:系統週期性所要執行的工作,如備份系統數據、清理緩存。配置文件位於/etc/crontab。
個人執行的工作:某個用戶定期要做的工作,如每隔10分鐘檢查郵件服務器是否有新信,這些工作可由每個用戶自行設置。配置文件位於/var/spool/cron/USERNAME


2.1 crontab的常用選項

-f file: 可以運行從指定的文件讀取的命令
-m:  執行結果以郵件方式發送給任務發起者
-l: at -l 相當於atq, 列出系統所有at任務
-d JOB_ID:at -d 相當於atrm, 刪除尚未執行的任務
-v: 顯示運行作業的時間
-c JOB_ID : 將任務內容顯示到屏幕



2.2 如何編輯crontab

使用crontab命令和-e(表示 “edit”)選項創建 crontab。這會打開vi編輯器.

當使用者爲系統cron時,需要下列7個字段。而當使用者爲用戶cron時,只需6個字段,與系統cron相比,無需指定用戶身份(user-name)

# 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

前5個爲時間段,可以使用通配符來表示特定時間:
*:相應時間點的所有有效取值 如,3 4 * * * root cat /etc/fstab  每天4:03分執行一次
,: 離散取值,   3,18,33,48 * * * * root cat /etc/fstab  每小時第3,18,33,48分鐘
/: 定義指定取值範圍內的頻率, 例如:*/3 * * * * root cat /etc/fstab  每3分鐘  

-: 連續取值:17 8-20/3 * * * root cat /etc/fstab  8-20點每3小時一次


2.3 如何以秒單位執行任務計劃:
方法1:
* * * * * /usr/bin/unison webdata
* * * * * sleep 30 && /usr/bin/unison webdata --每30秒執行一次


方法2:
* * * * * for i in 0 1 2; do some_job && sleep 15; done; some_job  --每15秒一次
* * * * * for i in {1..5}; do some_job && sleep 10; done; some_job  --每10秒一次

注意:使用%時要加反斜線。例如:
1 2 3 * * touch ~/file_$(date +\%Y\%m\%d).txt

但使用單引號後也可以不再使用反斜線,例如:
1 2 3 * * touch ~/file_$(date '+%Y%m%d').txt

2.4 系統cron的配置

# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/


2.4.1 PATH的定義:

如果是命令:使用絕對路徑
如果是腳本:在腳本自行定義PATH=


2.4.2 如果希望拒收郵件

方法一:
修改配置文件的開始部分MAILTO爲空, MAILTO=""
方法二:
將輸出結果重定向至/dev/null:  >/dev/null 2>&1   或  &> /dev/null

2.5 示例:


1、每5分鐘執行一次cat /etc/inittab命令;
*/5 * * * * root cat /etc/inittab
2、每週1,3,5執行備份/etc目錄;
2 3 * * 1,3,5 root tar -Jcf /backup/etc-`date '+%F'`.tar.xz /etc/*
3、每天中午12、13、14點,每5分鐘查看一次當前系統掛載的所有文件系統,將信息保存至/stats/mounts.txt文件中;
*/5 12-14 * * * mount >> /stats/mounts.txt
4、每週末上午9點至下午18點,每30分鐘取得一次當前系統的內存使用信息,並將其保存至/stats/memory.txt文件中;
2,32 9-18 * * 6,7 free >> /stats/memory.txt
5. 每週一至週五3點鐘,在目錄/home中,查找文件名爲*.txt的文件,並刪除5天前的文件。
00 03 * * 1-5 find /home "*.txt" -mtime +5 -exec rm -f {} /;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章