Linux | 定時任務

Linux | 定時任務

​ 有時候因為業務需要,服務白天不能停機,但是還需要更新服務,所以只能等到凌晨兩點的時候去運行腳本,去更新服務。所以這個時候定時任務就有用處了,可以寫一個腳本,在指定的時間段,啟動或者停止某個服務,這就實現了簡單的服務器自動化運維。

定時任務分為一次性定時任務 & 周期性定時任務:

  • 一次性定時任務:今天晚上的 2:30 執行 test.sh腳本。
  • 周期性定時任務:每天晚上的 2:30 都執行test.sh腳本。

一次性定時任務

顧名思意,一次性定時任務只執行一次,一般用於臨時的工作需要。

格式:

  # 第一種方法
  at 時間
  > 輸入要執行的內容。
  # 第二種方法
  要執行的命令 |  at 時間

以上兩種方法都行

我經常用的還是第二種,因為只需要一行就可以搞定一個簡單的一次性定時任務。

例如:

	echo "hello world" | at 14:25	

這種方法,可以以非交互式的方式創建一個Linux任務。

可以使用at -l命令查詢創建的所有一次性定時任務:

image-20210716143238666

像上面一樣,我一不小心,在 15:00 的時候,創建了兩個任務,這時,我可以用:atrm 定時任務的序列號 刪除任務。

image-20210716143435368

周期性定時任務

檢查 crontab 服務是否安裝

	rpm -qa | grep crontab

因為這個軟件是系統默認自帶的,所以大部分系統都會有這個應用。如果沒有,請使用: yum -y install crontab 進行安裝。

檢查 crontab 服務是否開啟

	/etc/init.d/crond start # 啟動服務
	/etc/init.d/crond stop  # 關閉服務
	/etc/init.d/crond restart # 重啟服務
	/etc/init.d/crond reload # 重新載入服務

加入開機啟動:

chkconfig --level 35 crond on

crontab 配置文件

crontab 以分為全局和用戶個人的配置文件,全說全局的配置文件:

全局配置

全局的配置文件全在 /etc/目錄下面:

image-20210716145420612

配置文件跟據後綴名不一樣,可以分為:每天,每周,每月,每小時

cron.d是系統自己的定時任務配置文件

cron.deny 是用於控制不讓哪些用戶使用的 crontabl 功能

crontab 配置文件是用戶可以自定義定時任務的全局配置文件

我們着重看一下:crontab 文件:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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
# 分 日 天 月  星期  命令

前面三行是服務定義的變量,注釋下面才是我們添加定時任務的地方。

	* 號代表不做限制,比如說,如果分鐘字段是 * 號,那麼這個任務,每分鐘都執行。
	, 逗號代表分隔時間段的意思,如果一天內,只有 3,5,7 這個時間段執行這個任務那麼:3,5,7
	- 代碼範圍取值,當一個任務白天執行,晚上不執行的時候,可以這樣寫:[7-18]
	/ 代表時間的間隔頻率,比如 `*/10 * * * * 命令` 就是每過10 分鐘執行一次。

個人配置

每個用戶都有一個自己的定時任務配置,並且這個配置不和全局配置衝突,這個文件的位置在:/var/spool/cron/ 下面。

image-20210716151159797

我們可以在這裡修改自己的定時任務,也可以通過命令管理自己的定時任務:

	crontab -l # 查看定時任務
	crontab -e # 編輯定時任務

image-20210716151417737

image-20210716151443740

當使用 crontab -e 命令的時候,相當於編輯 /var/spool/cron/ 下面自己的定時任務文件一樣。

系統會每分鐘掃描一次這個文件,所以這個定時任務的生效時間是下一分鐘。

例子

每天早上6點

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因為cron把任何輸出都email到root的信箱了。

每兩個小時

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11點到早上8點之間每兩個小時和早上八點

0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點

0 11 4 * 1-3 command line

1月1日早上4點

0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出現錯誤,或者有數據輸出,數據作為郵件發給這個帳號 HOME=/

每小時執行/etc/cron.hourly內的腳本

01 * * * * root run-parts /etc/cron.hourly

每天執行/etc/cron.daily內的腳本

02 4 * * * root run-parts /etc/cron.daily

每星期執行/etc/cron.weekly內的腳本

22 4 * * 0 root run-parts /etc/cron.weekly

每月去執行/etc/cron.monthly內的腳本

42 4 1 * * root run-parts /etc/cron.monthly

注意: “run-parts”這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名。

每天的下午4點、5點、6點的5 min、15 min、25 min、35 min、45 min、55 min時執行命令。

5,15,25,35,45,55 16,17,18 * * * command

每周一,三,五的下午3:00系統進入維護狀態,重新啟動系統。

00 15 * * 1,3,5 shutdown -r +5

每小時的10分,40分執行用戶目錄下的innd/bbslin這個指令:

10,40 * * * * innd/bbslink

每小時的1分執行用戶目錄下的bin/account這個指令:

1 * * * * bin/account

每天早晨三點二十分執行用戶目錄下如下所示的兩個指令(每個指令以;分隔):

20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#@62;expire.1st)


細節決定成敗!
個人愚見,如有不對,懇請扶正!