1. 程式人生 > >Linux監聽進程是否存在,並加入定時任務

Linux監聽進程是否存在,並加入定時任務

cron spa /etc/ 內容 自己的 http 每天 scrip blank

前言

我們在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命令選項在執行某一文件之前檢查它是否存在。

參考文章:用shell腳本監控進程是否存在 不存在則啟動的實例

Linux監聽進程是否存在,並加入定時任務