1. 程式人生 > >【Linux】定時任務-crontab

【Linux】定時任務-crontab

[toc]

1.1 定時任務crond介紹

Crond是linux系統中用來定期執行命令/指令碼或指定程式任務的一種服務或軟體,一般情況下,安裝完centos 6/7等linux作業系統之後,預設便會啟動crond任務排程服務,crond服務也會定期(預設每分鐘檢查一次)檢查系統中是否有要執行的任務工作,如果有,便會根據其預先設定的定時任務規則自動執行該定時任務工作,這個crond定時任務服務就相當於“鬧鐘”一樣。

1.2 Linux系統的定時任務

Linux系統中定時任務排程的工作可分為以下兩種情況:

一、 linux系統自身定期執行的任務工作:
系統週期性自行執行的任務工作,如輪詢系統日誌,備份系統資料,清理系統快取等,這些任務無需我們人為干預。

[root@node1 ~]# ls -l /var/log/messages*            # 系統的日誌
-rw-------. 1 root root 36080506 9月   1 11:56 /var/log/messages
-rw-------. 1 root root 26616060 8月  11 15:44 /var/log/messages-20190811
-rw-------. 1 root root 26112559 8月  19 10:23 /var/log/messages-20190819
[root@node1 ~]# ls -l /var/log/secure*              # 使用者登入日誌
-rw-------. 1 root root 10021 9月   1 11:56 /var/log/secure
-rw-------. 1 root root 15821 8月  11 14:44 /var/log/secure-20190811
-rw-------. 1 root root  9131 8月  19 09:51 /var/log/secure-20190819

二、使用者執行的任務工作:
某個使用者或系統管理員定期要做的任務工作,例如每天晚上0點對tomcat日誌進行切割及備份資料庫資料,一般這些工作都需要由運維自行設定才行。

例項:每晚0點對tomcat日誌進行切割

[root@node1 ~]# crontab –l
0 0 * * * /bin/sh /server/scripts/tomcat_backup.sh  >/dev/null 2>&1

使用者執行的工作,也就是我們運維管理人員執行的任務工作,因此使用者執行的任務是本篇文章的重點。

1.2.2 Linux系統下的定時任務軟體的種類

嚴格說,linux系統下的定時任務還真不少,例如:at,crontab,anacron

假如:某天晚上需要處理一個任務,僅僅是這一天的晚上,屬於突發性的工作任務。要執行at命令,還需要啟動一個atd的服務才行,在實際工作中,需要用到的時候幾乎沒有,因此此處也不詳解。

crontab命令
正如前面所說的這個命令可以週期性的執行任務工作。

例如:每晚0點備份資料庫資料。如果要執行crontab這個命令,也需要啟動一個服務crond才行,此命令也是生產環境最常使用到的命令。

Centos7系統 檢視crond服務是否開機自啟

[root@node1 ~]# systemctl list-unit-files |grep crond
crond.service                               enabled 

注:centos6系統應使用如下命令:

chkconfig  –-list |grep crond

檢視crond服務程序

[root@node1 ~]# ps -elf|grep [c]rond
4 S root   633  1  0  80  0 - 31555 hrtime 14:03 ?   00:00:00 /usr/sbin/crond -n

anacron:此命令主要用於非7*24小時開機的伺服器準備的,anacron並不能指定具體時間執行任務工作,而是以天為週期或者在系統每次開機後執行的任務工作。 它會檢測伺服器停機期間應該執行,但是並沒有執行的任務工作,並將該任務執行一遍。

小結:

  1. crond服務是執行的程式,而crontab是用來管理使用者的定時任務(規則)的命令
  2. crond服務是企業生產工作中常用的重要服務,at和anacron可忽略使用方法
  3. 幾乎每個伺服器都會用到crond服務

1.3 定時任務crond使用說明

1.3.1 指令語法

crontab 【-u user】 {-l|-e|-r|-i}

檢視系統幫助

man crontab
[root@node1 ~]# crontab --help
crontab:無效選項 -- -
crontab: usage error: unrecognized option
Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  define user
 -e         edit user's crontab
 -l         list user's crontab
 -r         delete user's crontab
 -i         prompt before deleting
 -n <host>  set host in cluster to run users' crontabs
 -c         get host in cluster to run users' crontabs
 -s         selinux context
 -x <mask>  enable debugging

Default operation is replace, per 1003.2

crontab –l檢視當前使用者的定時任務配置

[root@node1 ~]# crontab –l
0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1       #tomcat日誌切割

crontab –e進入當前使用者的定時任務vim編輯模式

[root@node1 ~]# crontab –e
#tomcat日誌切割
0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1
~                                                                             
~

crontab –u 使用者名稱 –l檢視指定使用者的定時任務設定

[root@node1 ~]# crontab -u root –l
#tomcat日誌切割
0 0 * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1

[root@node1 ~]# crontab -u node1 -l
no crontab for node1

1.3.2 指令說明

通過crontab我們可以在固定的間隔時間執行指定的系統指令或script指令碼。時間間隔的單位可以是分鐘,小時,日,月,周及以上的任意組合。(注意:日和周不要組合)

crond服務通過crontab命令可以很容易的實現週期性的日誌分析或資料備份等企業運維場景工作

*/5 * * * * /bin/bash /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1

說明:

五個星含義:
*:分鐘 */5代表每隔5分鐘
*:小時
*:日
*:月
*:星期
/bin/sh /server/scripts/tomcat_log_cut.sh :需要執行的命令或指令碼(命令必須全路徑,可使用“which 命令”,檢視命令路徑)

1.3.3 使用者許可權及定時任務檔案

檔案說明
/etc/cron.deny(拒絕)該檔案中所列使用者不允許使用crontab
/etc/cron.allow(允許)該檔案優先順序高於cron.deny(預設不存在,一般不用)
/var/spool/cron/所有使用者crontab配置檔案預設都存在此目錄,檔名以使用者名稱命名
[root@node1 ~]# cat /etc/cron.deny 
node1
[root@node1 ~]# su - node1
[node1@node1 ~]$ crontab -l
You (node1) are not allowed to use this program (crontab)
See crontab(1) for more information
[node1@node1 ~]$ crontab -e
You (node1) are not allowed to use this program (crontab)
See crontab(1) for more information 
[root@node1 ~]#
[root@node1 ~]# ls /var/spool/cron/
root                   #預設是沒有的,只有此使用者建立了定時任務才有
[root@node1 ~]# cat /var/spool/cron/root 
0 0 * * * /bin/sh /server/scripts/tomcat_log_cut.sh >/dev/null 2>&1     #tomcat日誌切割

1.3.4 指令選項說明含義表

引數 | 含義 | 指定示例 ---|--- -l(字母) | 檢視crontab檔案內容 | crontab –l -e | 編輯crontab檔案內容 | crontab –e -r | 刪除crontab檔案內容 | crontab –r -u user | 指定使用的使用者執行任務 | crontab –u node1 -l

==特別強調:-r引數在生產中很少用,也請各位慎用,使用時,請大家務必懷著對rm –rf 一樣的態度,能夠不用,就絕對不用!!!==

補充: crontab{-l | -e }實際上就是在操作/var/spool/cron/當前使用者這樣的檔案

使用crontab命令的優點:

  1. crontab 可以檢查語法
  2. 輸入方便

1.3.5 定時任務指令的使用格式

預設情況下,當用戶建立定時任務規則後,該規則記錄對應的配置檔案會存在於/var/spool/cron中,其crontab配置檔案對應的檔名與登入的使用者名稱一致,如:root使用者的定時任務配置檔案為/var/spool/cron/root

crontab定時任務的書寫格式很簡單,使用者的定時任務規則一般分為6個段(每個段通過空格來分隔,系統的定時任務為/etc/crontab,分為七個段,以空格來分割),前五段為時間的設定段,第六段為所要執行的命令或指令碼任務段

[root@node1 ~]#  cat /etc/crontab 
# Example of job definition:
# .---------------- minute (0 - 59)     分鐘  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  星期 
# *  *  *  *  * user-name  command to be executed     
  分 時 日 月 周  

1.3.6 crontab語法格式中時間段的含義如下表

段 | 含義 | 取值範圍(整數) ---|--- 第一段 | 代表分鐘 | 00-59(00也可以是0) 第二段 | 代表小時 | 00-23 第三段 | 代表日,天 | 01-31 第四段 | 代表月份 | 01-12 第五段 | 代表星期,周幾 | 0-7(0和7都代表星期日)

==提示:時間記憶口訣:分時日月周。 取值範圍口訣,正常日期時間範圍。==

1.3.7 crontab語法格式中特殊符號含義如下表

特殊符號含義
**號,表示任意時間都,實際就是“每”的意思
-減號表示分隔符,表示一個時間範圍,區間段,如17點到19點 <br/>例如:每天的17,18,19點的00分執行任務。00 17-19 * * * cmd
逗號,表示分隔時段的意思 <br/>例如:每天的5點和10點00分執行任務,00 5,10 * * * cmd
/nN代表數字,即“每隔n單位時間”。 例如:每10分鐘執行一次任務可以寫成 <br/> */10 * * * * cmd ,其中,/10的範圍是0-59,因此也可以寫成0-59/10

1.3.8 圖片說明crontab使用方法

image

1.3.9 使用者定時任務例項

***** command    每1分鐘執行一次command
3,15 ***** command  每小時的第3和第15分鐘執行
3,15 8-11 * * * command   在上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * command   每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 command    每個星期一的上午8點到11點的第3和第15分鐘執行
22 14 * * 0 command        每週日的14點22分執行
02 04 * * * command        每天4點的02分鐘執行

1.4 附帶說明

1.4.1 crontab書寫格式說明

/dev/null 2>&1

例項

0 0 * * * /bin/sh  /shell/tomcat_log.sh>/dev/null 2 >&1   

解釋

0是標準輸入 使用<或<<
1是標準輸出 使用>或>>
2是標準錯誤輸出 使用2>或2>>
/dev/null 2>&1 即錯誤輸出與標準輸出全部重定向到空,可以寫成1>/dev/null 2>/dev/null

關於重定向的作用

  • 重定向到空可以避免碎片檔案佔用inode資源
  • 重定向到一個指定log裡,可以看任務是否執行

1.4.2 編寫定時任務注意點

  1. 每個任務添加註釋,誰寫的,什麼時間寫的,完成什麼需求
  2. 執行指令碼使用/bin/sh(防止指令碼無執行許可權),要執行的檔案路徑是從根開始的絕對路徑(防止找不到檔案)
  3. 儘量把要執行的命令放在腳本里,然後把指令碼放在定時任務裡。對於呼叫指令碼的定時任務,可以把標準輸出錯誤輸出重定向到空
  4. 定時任務中帶%無法執行,需要加\轉義
  5. 如果時上有值,分鐘上必須有值
  6. 日和周不要同時使用,會衝突
  7. >>>/dev/null 2>&1不要同時存在

1.4.3 常見故障及解決方法

一、日期錯誤

crontab編輯後報錯

crontab: installing new crontab  "/tmp/crontab.QZzQuN":1: bad minute

報錯原因:crontab –e只寫了命令,日期出現錯誤或者未填寫

解決方法:crontab –e重新編輯定時任務,正確書寫格式

二、inode號耗盡

設定crontab時提示:No space left on device

定位故障:

  1. 使用df –k檢查還有空間
  2. 使用df –i顯示/var已佔用100%,如果inode耗盡,則系統上將不能建立檔案
  3. 在/var/spoo/clientmqueue/有超多的檔案ls半天沒反應
  4. 使用rm –rf * 會自動跳出root,可使用xargs來解決
    cd /var/spool/clientmqueue  
    ls | xargs rm –f
    

故障分析:
系統中cron執行的程式有輸出內容,輸出內容會以郵件形式發給cron的使用者,而sendmail沒有啟動就產生了這些檔案

解決方法:將crontab裡面的命令後面加上>