linux定時任務

第1章 定時任務介紹

1.1 什麼是定時任務?

crondlinux系統中用來定期執行命令或指定程序任務的一種服務或軟件。一般情況下,我們按裝完操作系統後,默認遍會啓動crond服務調度服務,在我們面前的系統安裝及開機啓動優化設置中,我們也設置保留了crond開機啓動。crond服務會定期(默認每分鐘檢查一次)檢查系統中是否有要執行的任務工作。如果有。變會根據埼玉縣設定的定時任務規則執行該定時任務。這個crond定時任務就相當於我們平時早起使用的鬧鐘一樣。

特殊需求:crond服務搞不定了(如任務精確到秒),一般工作中寫腳本守護進程執行。

這裏要求理解進程、程序、守護進程之前的關係。

1.2 linux系統crond的定時任務

       linux系統中定時任務調度工作可以分爲以下兩種情況:

1.2.1 linux系統自身定期執行的任務工作:

系統週期性自行執行的任務工作,如輪詢系統日誌、備份系統數據、清理系統緩存等,這些任務無需我們認爲干預。如:

[root@oldboy ~]# ll /var/log/messages*

-rw-------  1root root  838513 Sep  8 23:52 /var/log/messages

-rw-------. 1 root root  496687 Aug 14 19:59/var/log/messages-20160814

-rw-------. 1 root root 1614991 Aug 21 12:14/var/log/messages-20160821

-rw-------  1root root 1419878 Aug 28 08:45 /var/log/messages-20160828

-rw-------  1root root 1104533 Sep  4 11:22/var/log/messages-20160904

1.2.2   用戶執行的任務工作:

某個用戶或系統管理員定期要做的任務工作,例如每隔5分鐘和互聯網上時間服務同步(這是安裝系統基礎優化部分的內容),每天晚上0點備份網站站點數據及數據庫數據,一般這些工作需要由每個用戶自行設置才行。所謂的用戶就是讀者或者在做的小夥伴。

       例如:服務器時間同步

[root@oldboy ~]# crontab -l

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

linux系統下定時任務軟件種類

1.3 linux系統下定時任務軟件

atcrontabanacron.

at定時任務,是一種臨時性的定時軟件,在命令行設置at定時任務,只會執行一次,然後失效。跟windowscmd中的at定時任務類似。(不常用)

anacron定時任務,該定時任務可以在系統關機後,將關機期間的沒有執行的定時任務在開機的時候自動都執行一遍。然而在生產環境中,服務器是不允許停機的,所以該服務基本上也不會用到。(幾乎不用)

crond定時任務,該服務是生產環境普遍用到的定時任務,可以精確到分鐘。在系統優化中的精簡開機服務啓動項中將該服務保留,開機啓動。

第2章 定時任務crond使用說明

2.1 指令語法

crond定時任務的命令爲crondtab,常用選項:

crontab [-u user] file

      crontab [-u user] [-l | -r | -e] [-i] [-s]

              -u(user)執行該定時任務的用戶

              -l(list)查看定時任務列表

              -e(edit)編輯定時任務

2.2 定時任務的文件

定時任務的執行是由系統每隔一分鐘,系統自動掃描一次定時任務的定時文件,如果存在定時任務,就執行相應的命令。

2.2.1 系統定時任務文件:

[root@oldboy ~]# cat /etc/crontab

SHELL=/bin/bash                             #默認編輯器

PATH=/sbin:/bin:/usr/sbin:/usr/bin          #定時任務中的PATH黃金變量

MAILTO=root                                 #默認生成文件的位置

HOME=/

 

# 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 beexecuted

系統定時任務有七部分組成:分、時、日、月、周、用戶和命令。

2.2.2 用戶的定時任務文件

用戶定時任務文件在/var/spool/cron/下,

如系統的定時任務文件:

cat /var/spool/cron/root

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null2>&1

用戶的定時任務由六部分組成:分、時、日、月、周、命令。

查看系統定時任務:

[root@oldboy ~]#crontab -l

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

編輯系統定時任務:

[root@oldboy ~]# crontab -e

#time sync by hz at 2016-8-19

*/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

crontab -e編輯定時任務實際上就是將定時任務寫到定時任務文件/var/spool/cron/root中,也可以直接將定時任務追加到該文件中。crontab -e的用法好處是系統自動檢測語法是否錯誤。所以初學者建議用此方法。

                             

2.3 定時任務中的時間表示

定時任務中的時間是由一些特殊的字符和數字以特殊的排序組成的。

符號

用法

*

*代表的意思,在什麼位置上就代表沒多長時間。

如:* * * *  *   表示每分鐘

     00 * * * * 表示每小時的整點

“,”表示間隔的時間,當時間不連續時,可以用逗號分隔開

如:15,30,45 *  * * *   表示每小時的第153045分鐘時執行命令。

-

-”可以用來表示連續的時間段,從某一時間開始到某一時間結束。

如:00  23,01-07 * * *  表示每天的晚上23點到第二天早上的7點的整點執行命令。

/

/”表示每隔的意思,就是每隔多長時間。

*/5 * * * *   表示每隔5分鐘執行一次命令

注意與*的區別

 

第3章 定時任務案例練習

實例3-1 

每隔五分鐘同步一次系統的時間

/5 * * * * /usr/sbin/ntpdate pool.ntp.org>/dev/null 2>&1

實例3-2 

每分鐘執行一次腳本/server/scripts/tar.sh

* * * * * /bin/sh /server/scripts/tar.sh>/dev/null 2>&1

實例3-3 

每天晚上12點執行腳本/bin/sh/server/scripts/tar_html.sh

00 00 * * * /bin/sh /bin/sh/server/scripts/tar_html.sh >/dev/null 2>&1

實例3-4 

每個月的4號和每週的週一至週三的上午11點整重啓Apache服務

00 11 4 * 1-3 /oldboy/weberber/apache/bin/apachectl restart

實例3-5 

* 23,00-07/1 * * * /application/apache/bin/apachectlgraceful

以上不是表示每天晚上的23點到第二天的早上七點每小時重啓一次Apache服務。

實際表達的意思是每分鐘執行一次命令

若要表示每小時執行一次重啓服務的正確寫法是:

00 23,00-07/1 * * * /application/apache/bin/apachectl graceful

第4章 企業書寫定時任務規範

在生產環境中,操作正確的重要性是不言而喻的。爲了避免操作中的失誤,規範的操作流程是做到減少失誤的有效方法,下面以一個生產環境的案例來說明一下操作的正確流程。

4.1 實例演示規範操作

實例4-1規範定時任務案例:

每分鐘打包備份/etc/services文件一次到/tmp目錄下,要求打包文件不被覆蓋。

1、在命令行下測試成功

[root@oldboy ~]# cd /etc/

[root@oldboy /etc]# tar -zcf/tmp/services_backup$(date +%F-%H-%M).tar.gz services

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-37.tar.gz

/tmp/services_backup2016-09-09-22-37.tar.gz

2、將執行命令寫入腳本

[root@oldboy ~]# mkdir -p /server/scripts/

[root@oldboy /etc]# vim/server/scripts/backup_services.sh

  1#!/bin/bash

  2 cd /etc/&&\

  3 /bin/tar-zcf /tmp/services_backup$(date +%F-%H-%M).tar.gz services

將前面執行成功的命令複製到腳本中,防止手動敲錯。

3、測試腳本

[root@oldboy /etc]# /bin/sh/server/scripts/backup_services.sh

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*

/tmp/services_backup2016-09-09-22-37.tar.gz

/tmp/services_backup2016-09-09-22-43.tar.gz

測試腳本時要用全路徑,測試完成注意查看測試結果

4、編寫定時任務

[root@oldboy /etc]# crontab -l |tail -2

#backup services by crh at 2016-09-09

* * * * * /bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1

注意定時任務的時間書寫格式,以及業務要求中的時間;

定時任務的命令要執行直接複製命令行中執行腳本的命令;

定時任務中執行腳本後結果記得定向到/dev/null中;

寫完定時任務注意查看是否正確

5、查看定時任務執行效果

[root@oldboy /etc]# ls/tmp/services_backup2016-09-09-22-*

/tmp/services_backup2016-09-09-22-49.tar.gz

/tmp/services_backup2016-09-09-22-50.tar.gz

/tmp/services_backup2016-09-09-22-51.tar.gz

/tmp/services_backup2016-09-09-22-52.tar.gz

/tmp/services_backup2016-09-09-22-53.tar.gz

[root@oldboy /etc]# tail -f /var/log/cron

…………

Sep  922:50:01 oldboy CROND[1542]: (root) CMD (/usr/lib64/sa/sa1 1 1)

Sep  922:51:01 oldboy CROND[1551]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

Sep  922:52:01 oldboy CROND[1557]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

Sep  922:53:01 oldboy CROND[1563]: (root) CMD (/bin/sh/server/scripts/backup_services.sh >/dev/null 2>&1)

查看執行的結果是否正確;

跟蹤定時任務日誌tail -f /var/log/cron 查看狀態

6、儘量多環境測試後在上產線。

個人的虛擬機測試à辦公室環境測試àIDC機房測試àIDC正式環境

4.2 定時任務規範操作步驟:

1、在命令行下測試成功

2、將執行命令寫入腳本

3、測試腳本

4、編寫定時任務

5、查看定時任務執行效果

6、儘量多環境測試後在上產線。

4.3 定時任務規範習慣

1、註釋【規範和習慣】

2、命令放腳本文件裏

3、進入目標的上級目錄打包

4、命令在命令行測試好,然後複製後放入腳本

5、腳本文件要放在固定的規範的目錄/server/scripts

6、取消tar命令及腳本的無用輸出

7、腳本名字用.sh結尾

8、腳本前面要用/bin/sh執行腳本,並且腳本也要全路徑

9、複製執行的全路徑的腳本到定時任務裏配置,或者配置好定時任務後,複製定時任務命令到命令行測試。

10、           定時任務的結尾要加上>/dev/null 2>&1


第5章 企業案例

5.1 企業案例:inode被填滿的企業案例子。

郵件消息隊列文件

CentOS5   /var/spool/clientmquenue/

CentOS6      /var/spool/postfix/maildrop/

和定時任務相關的原因:

在定時任務中,定時任務執行出現錯誤,但是有沒有講錯誤輸出定向到/dev/null中,而且系統中的郵件服務有沒有開啓,導致系統報錯小文件堆積在郵件消息隊列文件下,佔用完系統的inode

解決辦法:

1、將郵件服務打開,

2、將定時任務的結果定向到/dev/null 

5.2 linux定時任務生產java服務無法執行問題羣友案例

http://oldboy.blog.51cto.com/2561410/1541515

分析:

conrd定時任務中的環境變量只包含了系統中的小部分,在執行命令的時候如果沒有加全路徑或將環境變量加入到腳本中,就會導致定時任務執行失敗。所以在定時任務中執行的命令要加上全路徑。在特殊情況下(Java)要將環境變量導入到執行的腳本中。使得定時任務能夠正確執行。


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