前言
我們在linux主機上可能需要一直運行某一服務,如果關機后或者誤殺,使得服務停止,從而影響日常的任務。比如一BI項目數據庫的抽取,使用Taskctl調度,在每天固定時間進行數據的抽取,如果主機上Taskctl相關的服務進程被關閉的話,就會影響到數據的抽取!
定時任務(調度)
在LINUX中,周期執行的任務一般由cron
這個守護進程來處理[ps -ef|grep cron]
。cron
讀取一個或多個配置文件,這些配置文件中包含了命令行及其調用時間。
cron
的配置文件稱為“crontab”,是“cron table”的簡寫。
下面簡單說一下crontab的相關內容。
分類
Linux下的任務調度分為兩類:系統任務調度和用戶任務調度。
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
/etc/crontab文件包括下面幾行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/
# run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
前四行是用來配置crond任務運行的環境變量,第一行SHELL變量指定了系統要使用哪個shell,這里是bash,第二行PATH變量指定了系統執行命令的路徑,第三行MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給root用戶,如果MAILTO變量的值為空,則表示不發送任務執行信息給用戶,第四行的HOME變量指定了在執行命令或者腳本時使用的主目錄。
用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計划任務。所有用戶定義的crontab文件都被保存在/var/spool/cron
目錄中。其文件名與用戶名一致,使用者權限文件如下:
/etc/cron.deny
該文件中所列用戶不允許使用crontab命令
/etc/cron.allow
該文件中所列用戶允許使用crontab命令
/var/spool/cron/
所有用戶crontab文件存放的目錄,以用戶名命名
創建任務
crontab -e
,然后就會有個vi編輯界面,再輸入一定格式的內容到里面 :wq 保存退出,即創建一個定時任務。
該一定格式的內容包括六個域,其中前五個域是指定命令被執行的時間,最后一個域是要被執行的命令。
每個域之間使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
- 1
對應的合法值 00-59
, 00-23
,01-31
, 01-12
,0-6 (0 is sunday)
, commands(代表要執行的腳本)
除了數字還有幾個特殊的符號就是星號"*"
、斜杠"/"
、中划線"-"
、逗號","
。
*
代表所有的取值范圍內的數字,
/
代表每的意思,/5
表示每5個單位,
-
代表從某個數字到某個數字,
,
分開幾個離散的數字。
比如:0 0 * * * sh /home/sh/monitor.sh
,每天凌晨0點0分執行monitor.sh這個腳本。
更多內容可以參考:linux下添加定時任務
crond服務相關命令
/sbin/service crond start //啟動服務 /sbin/service crond stop //關閉服務 /sbin/service crond restart //重啟服務 /sbin/service crond reload //重新載入配置 /sbin/service crond status //查看服務狀態
- 1
- 2
- 3
- 4
- 5
查看crontab服務是否已設置為開機啟動,執行命令:ntsysv
,此命令需要是root用戶。
加入開機自動啟動:chkconfig --level 5 crond on
之后查看:chkconfig --list|grep crond
監聽服務進程是否存在
上邊說了定時任務,每天固定時間執行shell腳本,那么這個腳本我們可以寫上監聽該服務進程的內容。
monitor.sh
這里以Taskctl相關服務為例:
#!/bin/sh NOWTIME=$(date +%Y%m%d_%H%M%S) ps -fe|grep emnls|grep -v grep if [ $? -ne 0 ] then echo $NOWTIME" stopped.....">>/home/mars/checkprolog.txt eminit ctlinit ctlstart else echo $NOWTIME " running....." >>/home/mars/checkprolog.txt fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
其中,NOWTIME=$(date +%Y%m%d_%H%M%S)
得到當前系統時間,沒有什么好說的,注意date后邊有一個空格!emnls
為Taskctl核心服務進程名稱。$? -ne 0
不存在,$? -eq 0
存在。
shell的if else 語法以及大於,小於等邏輯表達式:
if .... then .... elif .... then .... else .... fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字符串、判斷文件是否存在及是否可讀等等… 通常用” [ ] “來表示條件測試。注意這里的空格很重要,要確保方括號的空格。
[ -f "somefile" ]
:判斷是否是一個文件
[ -x "/bin/ls" ]
:判斷/bin/ls
是否存在並有可執行權限
[ -n "$var" ]
:判斷$var
變量是否有值
[ "$a" = "$b" ]
:判斷$a
和$b
是否相等
對一個文件的判斷:
-r file 用戶可讀為真 -w file 用戶可寫為真 -x file 用戶可執行為真 -f file 文件為正規文件為真 -d file 文件為目錄為真 -c file 文件為字符特殊文件為真 -b file 文件為塊特殊文件為真 -s file 文件大小非0時為真 -t file 當文件描述符(默認為1)指定的設備為終端時為真
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
對於不含變量的任務簡單shell腳本一般能勝任。但在執行一些決策任務時,就需要包含if/then的條件判斷了。shell腳本編程支持此類運算,包括比較運算、判斷文件是否存在等。基本的if條件命令選項有: - eq —比較兩個參數是否相等
(例如,if [ 2 –eq 5 ])
-ne —比較兩個參數是否不相等 -lt —參數1是否小於參數2 -le —參數1是否小於等於參數2 -gt —參數1是否大於參數2 -ge —參數1是否大於等於參數2 -f — 檢查某文件是否存在(例如,if [ -f "filename" ]) -d — 檢查目錄是否存在
- 1
- 2
- 3
- 4
- 5
- 6
- 7
幾乎所有的判斷都可以用這些比較運算符實現。腳本中常用-f命令選項在執行某一文件之前檢查它是否存在。