国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

centos中shell定時(shí)檢測(cè)mysqld,nginx,httpd服務(wù)腳本

2024-08-27 23:59:12
字體:
供稿:網(wǎng)友

現(xiàn)在我們會(huì)發(fā)現(xiàn)很多個(gè)人站長(zhǎng)的博客都會(huì)有不定時(shí)的打不開,要不是mysql數(shù)據(jù)庫停止了,要么是nginx 502了或者apache不運(yùn)行了,為了防止網(wǎng)站出現(xiàn)此問題我們給各位整理了一些監(jiān)控這些服務(wù)是不是正常工作的代碼,希望可幫助大家.

前幾天發(fā)現(xiàn)網(wǎng)站打不開,提示數(shù)據(jù)庫連接錯(cuò)誤,我登錄linux 發(fā)現(xiàn)mysqld服務(wù)不知道什么時(shí)候停止了,幸好我即使發(fā)現(xiàn).

于是決定寫一個(gè)shell腳本每分鐘自動(dòng)檢測(cè)mysqld服務(wù),如果發(fā)現(xiàn)服務(wù)沒起來就自動(dòng)啟動(dòng)mysqld服務(wù),也就是:通過cron定時(shí)任務(wù)執(zhí)行檢測(cè)腳本.

編寫檢測(cè)腳本 /root/bin/check,代碼如下:

  1. #!/bin/bash 
  2.  
  3. check=`pgrep mysql` 
  4.  
  5. if [ -n "$check" ]; then 
  6.         exit 
  7. else 
  8.         date=$(date +"%Y-%m-%d %H:%M:%S"
  9.         /etc/init.d/mysqld  start  //Vevb.com 
  10.         echo 'error: mysqld at ' $date 
  11. fi 

說明:也可以修改check=`pgrep mysql` 比如 check=`pgrep httpd` 或者 check=`pgrep nginx`來監(jiān)測(cè)其他服務(wù),

編輯cron執(zhí)行:crontab -e

cron內(nèi)容如下,其中注釋掉了一行,可選擇性編寫.

#* * * * * sh /root/bin/check > /dev/null 2>&1 #執(zhí)行后不發(fā)送結(jié)果郵件

* * * * * sh /root/bin/check >> /root/bin/log.txt #執(zhí)行后發(fā)送結(jié)果到指定文件

由于cron每次執(zhí)行后如果有輸出則會(huì)默認(rèn)發(fā)送郵件到 /var/spool/mail/root 長(zhǎng)時(shí)間會(huì)導(dǎo)致 此文件有很多無用記錄,我們可以用 > /dev/null 2>&1 忽略結(jié)果寫入,當(dāng)然也可以用 >> /root/bin/log.txt 寫入到指定文件(要事先建立好文件).

cron命令行簡(jiǎn)要說明:

  1. 分 時(shí) 日 月 星期 命令行 
  2. 例: */5 * * * * cmd #表示每5分鐘執(zhí)行一次命令 
  3. command > filename 把標(biāo)準(zhǔn)輸出重定向到一個(gè)新文件中 
  4. command >> filename 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加) 
  5. command 1 > fielname 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中 
  6. command > filename 2>&1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中 
  7. command 2 > filename 把標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件中 
  8. command 2 >> filename 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加) 
  9. command >> filename 2>&1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中(追加) 
  10. command < filename >filename2 把command命令以filename文件作為標(biāo)準(zhǔn)輸入,以filename2文件作為標(biāo)準(zhǔn)輸出 
  11. command < filename 把command命令以filename文件作為標(biāo)準(zhǔn)輸入 
  12. command << delimiter 把從標(biāo)準(zhǔn)輸入中讀入,直至遇到delimiter分界符 
  13. command <&m 把文件描述符m作為標(biāo)準(zhǔn)輸入 
  14. command >&m 把標(biāo)準(zhǔn)輸出重定向到文件描述符m中 
  15. command <&- 把關(guān)閉標(biāo)準(zhǔn)輸入 
  16. command 2>&1 把command命令標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出 

下面的shell通過一個(gè)while-do循環(huán),用ps -ef|grep 檢查loader進(jìn)程是否正在運(yùn)行,如果沒有運(yùn)行,則啟動(dòng),這樣就保證了崩潰掛掉的進(jìn)程重新被及時(shí)啟動(dòng).

必須注意兩點(diǎn):

1、ps |grep 一個(gè)進(jìn)程時(shí)必須加上其路勁,否則容易grep到錯(cuò)誤的結(jié)果.

2、必須用 -v 從結(jié)果中去除grep命令自身,否則結(jié)果非空,代碼如下:

  1. #!/bin/sh 
  2. #===================== 
  3. #Vevb.com 
  4. #khler@163.com 
  5. #===================== 
  6. while : 
  7. do 
  8.   echo "Current DIR is " $PWD 
  9.   stillRunning=$(ps -ef |grep "$PWD/loader" |grep -v "grep"
  10.   if [ "$stillRunning" ] ; then 
  11.     echo "TWS service was already started by another way"  
  12.     echo "Kill it and then startup by this shell, other wise this shell will loop out this message annoyingly"   //Vevb.com 
  13.     kill -9 $pidof $PWD/loader 
  14.   else 
  15.     echo "TWS service was not started"  
  16.     echo "Starting service ..."  
  17.     $PWD/loader 
  18.     echo "TWS service was exited!"  
  19.   fi 
  20.   sleep 10 
  21. done 

如果啟動(dòng)此shell時(shí)發(fā)現(xiàn)進(jìn)程已經(jīng)存在,說明以別的方式啟動(dòng)了進(jìn)程而不是此shell,那么它會(huì)持續(xù)提醒找到進(jìn)程,解決辦法是,要么只用此shell啟動(dòng)服務(wù),要么一經(jīng)發(fā)現(xiàn)以其他方式啟動(dòng)的服務(wù)即kill掉,上面的語句就是這么干的:

kill -9 $pidof $PWD/loader

再補(bǔ)充一個(gè)監(jiān)控nginx的shell腳本

Nginx 雖然處理并發(fā)量比 apache 確實(shí)要強(qiáng)點(diǎn),但它這種 php-cgi 模式不是太穩(wěn)定,這點(diǎn)網(wǎng)上也有朋友總結(jié)了,我在實(shí)現(xiàn)項(xiàng)目中也感受到了。

我們一臺(tái)支付機(jī),偶爾會(huì)出現(xiàn)以下情況的:php-cgi 進(jìn)程突然消失了,造成PHP腳本無法訪問;更不可思議的是明明是php-cgi 打開有兩個(gè)端口在監(jiān)聽的,莫名其秒的突然有一個(gè)php-cgi 的端口被關(guān)閉了,造成所有請(qǐng)求全積在一個(gè)端口上,結(jié)果造成PHP腳本訪問異常。

基本這種情況,我寫了個(gè)監(jiān)控shell腳本的解決方案,不管以上出現(xiàn)那種情況,都自動(dòng)恢復(fù)Nginx的服務(wù).該腳本在生產(chǎn)環(huán)境上運(yùn)行正常,代碼如下:

  1. #!/bin/bash 
  2. # filename: webservermonitor.sh 
  3. # 功能:監(jiān)控 nginx 的 php-cgi 是否正常 
  4. # 作者:V哥 
  5. # 運(yùn)行: webservermonitor.sh & 
  6. # php-cgi 監(jiān)聽的IP和端口 
  7. V_PHP_CGI_PORT="127.0.0.1:9000 127.0.0.1:9001" 
  8. # nginx重啟的腳本 
  9. V_NGINX="/usr/local/nginx/sbin/restart.sh" 
  10. # 日志文件 
  11. V_LOG="/tmp/webservermonitor.log" 
  12. # 函數(shù)定義:重啟nginx 
  13. function restart_nginx(){ 
  14.     echo "----- `date` -----" >> $V_LOG 
  15.     echo "------------------" >> $V_LOG 
  16.     echo "`ps aux |grep 'nginx'`" >> $V_LOG 
  17.     echo "------------------" >> $V_LOG 
  18.     echo "`ps aux |grep 'php-cgi'`" >> $V_LOG 
  19.     echo "------------------" >> $V_LOG 
  20.     echo "`netstat -nlpt | grep 'php-cgi'`" >> $V_LOG 
  21.     echo "------------------" >> $V_LOG 
  22.     $V_NGINX  >> $V_LOG 
  23. # 循環(huán)執(zhí)行,不采用 crontab ,國為 crontab 最小單位是分鐘,時(shí)間太長(zhǎng)了 
  24. while : 
  25. do 
  26.     # 1:先檢測(cè) nginx 主進(jìn)程是否存在 
  27.     V_NGINX_NUM=`ps axu |grep 'nginx' |grep -v 'grep' |wc -l` 
  28.     if [ $V_NGINX_NUM -lt 1 ];then 
  29.         restart_nginx 
  30.         continue 
  31.     fi 
  32.     # 2:再檢查php-cgi是否有進(jìn)程存在 
  33.     V_PHP_CGI_NUM=`ps axu |grep 'php-cgi' |grep -v 'grep' |wc -l` 
  34.     if [ $V_PHP_CGI_NUM -lt 1 ];then 
  35.         restart_nginx 
  36.         continue 
  37.     fi 
  38.     # 3:再判斷端口是否正常 
  39.     for PORT in $V_PHP_CGI_PORT 
  40.     do 
  41.         V_NUM=`eval "netstat -nlpt | grep '${PORT}' | wc -l"
  42.         if [ $V_NUM -lt 1 ];then 
  43.             restart_nginx 
  44.             continue 
  45.         fi 
  46.     done 
  47.     # 休眠 
  48.     sleep 5 
  49. done 

ps:當(dāng)然現(xiàn)在有一些服務(wù)器也提供方法像dnspod就提供了域名監(jiān)控功能,可以監(jiān)控到服務(wù)器是否正常哦.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 容城县| 南平市| 定结县| 林州市| 马山县| 舒城县| 灌云县| 太康县| 介休市| 绥江县| 砀山县| 广汉市| 林芝县| 时尚| 湖北省| 时尚| 门头沟区| 定远县| 清远市| 上思县| 颍上县| 永寿县| 巴南区| 成武县| 天门市| 保康县| 温泉县| 湖南省| 红桥区| 尚义县| 安丘市| 万宁市| 霍城县| 昌黎县| 新乡市| 柳林县| 运城市| 雷山县| 临沭县| 南皮县| 邻水|