1、Linux 工作排程的種類: at, crontab
種類 | 依賴服務 | 描述 |
at | atd | 是個處理僅執行一次就結束排程的命令,不過要執行 at 時,必須要啓動 atd 這個服務 |
crontab | crond | 這個指令所設定的工作將會循環的一直進行下去,必須要啓動 crond 這個服務。 |
2、使用者的設定:可以限制使用 crontab 的使用者賬號:
/etc/cron.deny | 將不可使用crontab的賬號寫入其中,一個賬號一行 |
/etc/cron.allow | 將允許的賬號寫入其中 |
3、
/var/spool/cron/使用用戶 | 記錄用戶的crontab工作。/var/spool/cron/root是root用戶的定時任務配置文件 |
/var/log/cron | 記錄cron 執行的每一項工作。可以檢查有沒有*** |
[root@www /]# cat /var/spool/cron/root
#backup /etc/hosts/etc/rc.local by shiwei at 2016-08-17
* * * * * /bin/sh /server/scripts/back.sh
[root@www /]# cat /var/log/cron
Aug 17 15:25:02www CROND[25845]: (root) CMD (/bin/sh /server/scripts/back.sh)
4、檢查crond服務有沒有啓動
(1)[root@www /]# ps-ef |grep crond|grep -v grep
root 26331 1 017:21 ? 00:00:01 crond
(2)[root@www /]# /etc/init.d/crond status
crond (pid 26331)is running...
5、啓動crond服務:
/sbin/service crond start | 啓動服務 |
/sbin/service crond stop | 關閉服務 |
/sbin/service crond restart | 重啓服務 |
/sbin/service crond reload | 重新載入配置 |
6、crontab命令
-e(edit) | 編輯crontab的工作內容 |
-l(list) | 查看crontab的工作內容 |
-r(remove) | 移除所有的 crontab 的工作內容,若僅要移除一項,用 -e 編輯 |
7、定時任務指令的使用格式:
用戶的定時任務規則一般分爲6段,每個段通過空格來分隔。
** * * * command
分時日月周
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 周 | cmd |
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 |
注意:周的數字爲0或7時,都代表星期天
特殊字符 | 代表意義 |
* | 星號,表示任意時間都接受,“每”的意思 |
- | 減號,代表一個時間段。如:17-19點 |
, | 逗號,分隔時段。如:30 2,3,4 * * * cmd |
/n | n代表數字,即每隔n單位時間。如:*/3 |
例子:
(1)30 3,12 * * * /bin/sh/scripts/oldboy.sh
每天凌晨3點和中午的12點的半點時刻執行腳本文件
(2)0,30 18-23 * * * cmd
每天18點至23點之間每隔半小時執行命令或腳本文件
(3)30 */6 * * * cmd
每隔6小時的半點時刻執行腳本或命令
(4)40 5 * * 6,0 cmd
每週六,週日的5:45分執行腳本或命令
(5)00 */2 ** * cmd (易錯)
每隔兩小時執行腳本或命令
(6)00 11 * 4 1-3 cmd
4月的每週一至週三的上午11點執行命令或腳本
8、系統的配置文件:/etc/crontab
[root@www /]# cat /etc/crontab
SHELL=/bin/bash<<==使用哪種shell接口
PATH=/sbin:/bin:/usr/sbin:/usr/bin<<==執行文件搜尋路徑
MAILTO=root<<==當 /etc/crontab中的例行性工作的指令發生錯誤時,或是該工作的執行結果有STDOUT/STDERR 時,會將錯誤訊息或是屏幕顯示的訊息傳給誰?
HOME=/<<==默認此shell的家目錄所在
系統的定時任務分爲7個段,以空格來分隔:
* * * * *user-name command
9、一些注意事項:
(1)資源分配不均的問題
(2)取消不必要的輸出項目:
當有執行結果或是執行的項目中有輸出的數據時,該數據將會 mail 給MAILTO 設定的賬號,那麼當有一個排程一直出錯那麼你就會一直收到錯誤消息。重定向到垃圾桶(>/dev/null 2>&1)
(3)安全的檢驗:
很多時候被植入***都是以例行命令的方式植入的,所以可以藉由檢查/var/log/cron 的內容來視察是否有非自己設定的cron 被執行了。
(4)周與日月不可同時並存:
即:不可使用【幾月幾日且爲星期幾】的寫法。
10、定時任務規範:
(1)定時任務執行的腳本要規範路徑:如:在/server/scripts目錄下創建腳本
(2)要先在命令行執行要寫到腳本里的命令,確保無誤,再把命令複製粘貼到腳本里
(3)腳本里的命令要使用全路徑(可用which查詢命令全路徑)
(4)使用crontab –e編輯定時任務時,要添加必要的註釋
(5)定時任務命令或腳本結尾需要加>/dev/null 2>&1,清楚不必要的輸出或錯誤輸出
(6)執行shell腳本任務前加/bin/sh
(7)注意%放在crontab –e裏需要轉義,而在腳本里無需轉義
(8)可通過crond定時任務日誌調試(/var/log/cron)定時任務
(9)sh –x調試腳本
11、通過例子實戰定時任務:
例1、優化:設置linux服務器時間同步互聯網時間(NTP服務)
(1)手動同步:同步阿里雲的時間服務器
[root@www /]#/usr/sbin/ntpdate ntp1.aliyun.com
18 Aug 10:56:36 ntpdate[2166]: step timeserver 182.92.12.11 offset 3.666680 sec
(2)通過定時任務同步:假設每隔5分鐘做一次時間同步
[root@www /]# echo '#time sync by shiwei at2016-08-18'>>/var/spool/cron/root(添加註釋)
[root@www /]# echo'*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null2>&1'>>/var/spool/cron/root
其實就是vi /var/spool/cron/root
特別說明:定時任務命令或程序最好寫到腳本里執行
例2、通過編輯腳本配置定時任務
每天晚上00:30,打包服務器配置文件/etc/rc.local, /etc/hosts,備份到/backup目錄下,每次備份按時間生成不同的備份包,並刪除5天前的備份包。
第一步:創建腳本存放的目錄:
[root@www /]# mkdir -p /server/scripts
第二步:創建備份目錄:
[root@www/]# mkdir backup
第三步:切換到根目錄,在命令行執行命令,確保命令正確
[root@www/]# cd /
[root@www/]# tar -zchf backup/bak_$(date+%F-%H-%M).tar.gz etc/hosts etc/rc.local
[root@www/]# cd backup/
[root@wwwbackup]# ll
total4
-rw-r--r--.1 root root 363 Aug 18 16:10 bak_2016-08-18-16-10.tar.gz
第四步:編輯腳本,並把複製上面執行的命令粘貼在腳本里,這樣不容易錯
[root@www/]# cd /server/scripts/
[root@wwwscripts]# vim backup.sh
cd / &&\
/bin tar -zchfbackup/bak_$(date +%F-%H:%M).tar.gz etc/hosts etc/rc.local &&\
/bin/find /backup -type f-name "*.tar.gz" -mtime +5 |xargs rm –f
第五步:測試腳本成不成功:
[root@wwwbackup]# sh /server/scripts/backup.sh
[root@wwwbackup]# ll
total4
-rw-r--r--.1 root root 363 Aug 18 16:41 bak_2016-08-18-16:41.tar.gz
第六步:編輯定時任務
[root@wwwscripts]# crontab –e
#file backup by shiwei at2016-08-18
30 00 * * * /bin/sh /server/scripts/backup.sh >/dev/null2>&1
第七步:查看定時任務
[root@wwwscripts]# crontab –l
第八步:如果腳本有誤,需要調試腳本
[root@www/]# sh -x /server/scripts/backup.sh
+cd /
++date +%F-%H-%M
+/bin/tar -zchf backup/bak_2016-08-18-16:46.tar.gz etc/hosts etc/rc.local
+xargs rm -f
+/bin/find /backup -type f -name '*.tar.gz' -mtime +5