Linux shell程式設計之控制指令碼之定時執行

2021-12-30 07:39:22 字數 4527 閱讀 3570

目錄

控制指令碼之定時執行

①cron時間表(系統不關機情況下)

②與cron相關的檔案和目錄

③anacron

④crontab定時任務

定時任務實戰

①cron時間表(系統不關機情況下)

>>>linux使用cron程式(通過檢查cron時間表)來計畫要定期執行的指令碼

>>>每個使用者(包括root)都有自身的cron時間表,linux提供了crontab命令來處理時間表

>>>預設不存在,使用crontab命令來建立計畫任務,將任務寫入檔案,寫入時會檢查語法格式是否正確

>>>當系統進行系統初始化時,cron從/etc/init.d中啟動

>>>cron程序會去搜尋/var/spool/cron目錄下的crontab檔案,並將其載入到記憶體中

[root@localhost ~]# ll /var/spool/cron

total 8

-rw-------. 1 bei bei 27 sep 26 01:50 bei

-r--------. 1 root root 40 aug 6 04:48 root

>>>cron程序還會去搜尋/etc/anacrontab(天周月相關檔案)和/etc/cron.d目錄下的檔案(小時相關檔案)

>>>定時任務執行時與命令列的環境變數不一樣

cron有兩種方式可以檢查cron tables的變化

>>>檢查對應的定時任務檔案的modtime

>>>使用inotify:啟動守護程序後,inotify會被記錄到/var/log/cron這個日誌檔案中

cron時間**式(時間戳 user-name command to be executed)

時間戳每個字段如下(建議都用數字表示)

field時間戳

minute

hour

day of month

month

day of week

allowed values

0-59

0-23

1-31

1-12 or jan、feb、mar…

0-6 or sun、mon、tue …

# 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

說明》每個字段可能包含星號 * ,表示"first-last"

>>>每個字段允許用數字範圍表示的,範圍是指用連字元「-」分隔的兩個數字,注意是閉區間

例:"0-6"表示的是:0,1,2,3,4,5,6

想要表示一組數字或範圍,可以用列表,用逗號","分隔的一組數字("1,2,3,4,5"或"10-12,15-17,19-21")

但是,使用英文前三個字母表示的時候,不能用"-"表示乙個範圍

>>>步長值可與範圍結合使用"/"

在範圍後面帶有"/",表示在範圍內跳過的數字的值

例:天數取「1-31/2」,表示1,3,5……,29,31,即只取每個月的單數天

>>>使用名稱表示欄位時,不允許使用範圍或列表方式(只能乙個名稱)

>>>第六個字段,指定要執行的命令,直到遇到換行符或%符號(當需要用到%用\轉義)

>>>命令執行的日期可以在兩個字段:day of month和day of week指定,如果兩個欄位都收到限制,當任一欄位與當前時間匹配,則認為當前時間應該被執行,

例:"0 0 1,15 * 0"表示每個月的1號,15號和每個星期日的00:00是定時時間

②與cron相關的檔案和目錄

>>>/etc/crontab檔案:系統級別的定時任務,只有root可以修改

該檔案預設情況下是空的,常用於執行每日、每週、每月的作業

檔案內容如下:

shell=/bin/bash

path=/sbin:/bin:/usr/sbin:/usr/bin #系統級別定時任務和系統的環境變數是不一樣的

mailto=root

home=/

# for details see man 4 crontabs

>>>/etc/cron.d

這個目錄的作用是每小時執行/etc/cron.hourly的定時任務

③anacron

>>>解決機器不連續工作,定時任務過期問題,當伺服器不連續工作,重新啟動就回去執行之前定時任務未執行的作業

>>>/etc/cron.d 每小時會執行一次anacron

>>>anacron以天為單位,當天的定時任務不會執行

>>>使用-s選項,只有當上一次作業結束,才會執行下乙個作業

>>>時間戳存在/var/spool/anacron目錄

④crontab定時任務

>>>crontab命令是用於建立、刪除或列出用於服務cron守護程式表的程式

>>>crontab建立的定時任務存放在/var/spool/cron目錄下(使用者無法編輯,只能用crontab命令去編輯)

[root@localhost ~]# ls -al /var/spool/cron

total 16

drwx------. 2 root root 4096 sep 27 00:35 .

drwxr-xr-x. 13 root root 4096 jun 24 10:46 ..

-rw-------. 1 bei bei 27 sep 26 01:50 bei

-r--------. 1 root root 40 aug 6 04:48 root

[root@localhost ~]#

[root@localhost ~]# ls -al /usr/bin/crontab

-rwsr-xr-x. 1 root root 51784 aug 23 2016 /usr/bin/crontab

說明:使用者無法編輯是因為沒有對/var/spool/cron這個目錄的寫許可權,

使用者可以用crontab命令去編輯/var/spool/cron目錄下自己的檔案,是因為/usr/bin/crontab有suid許可權

當/usr/bin/crontab被啟動為乙個程序,使用者就擁有了屬主root的許可權去建立,修改,刪除自己的定時任務了

>>>對於不同使用者。可以設定/etc/cron.allow和/etc/cron.deny,去禁止某些使用者使用定時任務

這兩個檔案只用其中乙個,若兩個檔案不存在,則是有root可以用定時任務

命令格式:crontab [-u user] 【-e | -l | -r】

命令描述

-uroot指定操作哪個使用者的檔案

-e編輯某個使用者crontab檔案內容

-l列出某個使用者crontab檔案內容

-r刪除某個使用者crontab檔案內容

-i互動式確認刪除crontab檔案

定時任務實戰

>>>每分鐘執行一次 commands

* * * * * commands

>>>每小時的第3和第15分鐘執行 commands

3,15 * * * * commands

>>>在上午的8點到11點的第3和第15分鐘執行 commands

3,15 8-11 * * * commands

>>>每隔一天的上午8點到11點的第3和第15分鐘執行 commands

3,15 8-11 */2 * * commands

>>>每週一上午8點到11點的第3和第15分鐘執行 commands

3,15 8-11 * * 1 commands

>>>每晚的21:30重啟networking

30 21 * * * /etc/init.d/networking restart

>>>每月1,20,22的的4.45重啟networking

45 4 1,20,22 * * /etc/init.d/networking restart

>>>每週

六、日的01:10重啟networking

10 1 * * 0,6 /etc/init.d/networking restart

>>>每天18:00至23:00之間每隔30分鐘重啟networking

0,30 18-23 * * * /etc/init.d/networking restart

思考題:如何在每個月的最後一天中午12:00執行commands

0 12 * * * if [ `date +%d -d tomorrow` -eq 1 ];then commands;fi

說明:這裡使用if-then語句,用來判斷明天是不是1號,若是1號,則執行commands

linux shell程式設計之 if語句

一 語句格式 一行中的寫法 if test commands then consequent commands fi 多行的寫法 if 條件 then command else command fi 基本語法記住亮點 1 按照漢語的方式記憶 如果 if 那麼 then 就 否則 else 就 2 記...

Linux shell程式設計之awk sed用法詳解

awk的用法 1.awk的使用 呼叫方式 1.命令列方式 2.將所有awk命令插入乙個檔案,並使awk程式可執行,然後使awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來呼叫它。3.將所有的awk命令插入乙個單獨檔案,然後呼叫。選項說明 f 域符號 預設為空格 f 指明awk指令碼 2.模式...

LINUX SHELL程式設計之遠端拷貝

使用expect,進行遠端拷貝 1.首先確認你的系統安裝有expect which expect 如果顯示如下,說明已經安裝完expect,如果沒有執行2 usr bin expect 2.yum install expect 3.遠端拷貝 usr bin expect f set password...