天天看點

關于定時任務,看着一系列就夠了——3.Linux定時任務一、簡介二、Crontab配置三、特殊事項:四、适應場景:

一、簡介

Linux系統任務是由 cron (crond) 這個系統服務來控制的,這個系統服務是預設啟動的。crond 指令每分锺會定期檢查是否有要執行的工作,如果有要執行的工作便會自動執行該工作。使用者自己設定的計劃任務則使用crontab 指令。

二、Crontab配置

在CentOS系統中,

cat /etc/crontab
           

配置檔案可以看到如下解釋:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
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 be executed
           

可以看到 建立一個定時任務 需要指定:

cron表達式 指定使用者(可省略) 具體執行任務

用基礎的 排程器、觸發器、執行器來劃分:

crontab程式本身是排程器,

在配置檔案中配的cron表達式是觸發器,

在配置檔案中配置的具體執行任務是執行器。

crontab文法

crontab [ -u user ] file
           

或者

crontab [ -u user ] { -l | -r | -e }
           

注:如果不使用 -u user 的話,就是表示設定自己的時程表。

-e : 執行文字編輯器來設定時程表(最常用)

-r : 删除目前的時程表

-l : 列出目前的時程表

舉例:

0 */2 * * * /sbin/service httpd restart  意思是每兩個小時重新開機一次apache 

50 7 * * * /sbin/service sshd start  意思是每天7:50開啟ssh服務 

50 22 * * * /sbin/service sshd stop  意思是每天22:50關閉ssh服務 

0 0 1,15 * * fsck /home  每月1号和15号檢查/home 磁盤 

1 * * * * /home/bruce/backup  每小時的第一分執行 /home/bruce/backup這個檔案 

00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3點鐘,在目錄/home中,查找檔案名為*.xxx的檔案,并删除4天前的檔案。

30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30執行一次ls指令
           

指令:

service crond start    //啟動服務
service crond stop    //關閉服務
service crond restart    //重新開機服務
service crond reload    //重新載入配置
           

三、特殊事項:

  1. crontab有2種編輯方式:直接編輯/etc/crontab檔案與crontab –e,其中/etc/crontab裡的計劃任務是系統中的計劃任務,而使用者的計劃任務需要通過crontab –e來編輯;
  2. 每次編輯完某個使用者的cron設定後,cron自動在/var/spool/cron下生成一個與此使用者同名的檔案,此使用者的cron資訊都記錄在這個檔案中,這個檔案是不可以直接編輯的,隻可以用crontab -e 來編輯。
  3. crontab中的command盡量使用絕對路徑,否則會經常因為路徑錯誤導緻任務無法執行。
  4. 新建立的cron job不會馬上執行,至少要等2分鐘才能執行,可從起cron來立即執行。
  5. %在crontab檔案中表示“換行”,是以假如腳本或指令含有%,需要使用\%來進行轉義。
  6. 腳本無法執行問題

如果我們使用 crontab 來定時執行腳本,無法執行,但是如果直接通過指令(如:./test.sh)又可 以正常執行,這主要是因為無法讀取環境變量的原因。

解決方法:

所有指令需要寫成絕對路徑形式,如: /usr/local/bin/docker。

在 shell 腳本開頭使用以下代碼:

#!/bin/sh

. /etc/profile
. ~/.bash_profile
           

3、在 /etc/crontab 中添加環境變量,在可執行指令之前添加指令 . /etc/profile;/bin/sh,使得環境變量生效,例如:

20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
           

四、适應場景:

Liunx的定時任務适合進行一些非業務的操作,比如簡單的檢測業務系統是否異常,定時清除一些系統備援資料,檢查系統情況等。在Liunx定時中不建議放特别複雜的邏輯。