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


前言

我們在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腳本監控進程是否存在 不存在則啟動的實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM