PHP+shell脚本操作Memcached和Apache Status的实例分享


Posted in PHP onMarch 11, 2016

memcached 进程启动及监控
1.memcached_inc.sh
设置路径,端口等讯息。

#!/bin/sh 
 
#config include 
 
HOST=$(hostname) 
SITE="mysite" 
PORT=11211 
 
MEMCACHED_PID_FILE="/tmp/memcached.pid" 
MEMCACHED_DAEMON_PID_FILE="/tmp/memcached_daemon.pid" 
 
MEMCACHED="memcached -d -m 64 -p $PORT -u memcache -l 127.0.0.1 -P $MEMCACHED_PID_FILE" 
MEMCACHED_DAEMON_FILE="memcached_daemon.sh" 
 
ERROR_LOG_FILE="${ROOT}/memcached_${SITE}_${HOST}_${PORT}.log"

2.gm_memcached.sh
控制memcached 启动,停止,重启。

#!/bin/sh 
 
#memcached start and stop 
#$1 action 
 
ROOT=$(cd "$(dirname "$0")"; pwd) 
 
. ${ROOT}/memcached_inc.sh 
 
 
start() { 
 
 if [ -f "$MEMCACHED_PID_FILE" ] && [ -s "$MEMCACHED_PID_FILE" ]; then 
  printf "memcached already running\n" 
 else 
  printf "starting memcached\n" 
  $MEMCACHED 
 
  sleep 2 
 
  PID=$(cat $MEMCACHED_PID_FILE) 
  printf "memcached is started PID:$PID\n" 
 
  printf "starting memcached daemon\n" 
  ${ROOT}/${MEMCACHED_DAEMON_FILE} & 
  DAEMON_PID=$! 
  echo ${DAEMON_PID} > ${MEMCACHED_DAEMON_PID_FILE} 
  printf "memcached daemon is started PID:${DAEMON_PID}\n" 
 fi 
 
} 
 
 
stop() { 
 
 if [ -f "$MEMCACHED_DAEMON_PID_FILE" ] && [ -s "$MEMCACHED_DAEMON_PID_FILE" ]; then 
  DAEMON_PID=$(cat $MEMCACHED_DAEMON_PID_FILE) 
  rm -f ${MEMCACHED_DAEMON_PID_FILE} 
  if [ ! -z ${DAEMON_PID} ]; then 
   kill -9 ${DAEMON_PID} 
  fi 
  printf "memcached daemon is stopped\n" 
 else 
  printf "no memcached daemon running\n" 
 fi 
 
 sleep 1 
 
 if [ -f "$MEMCACHED_PID_FILE" ] && [ -s "$MEMCACHED_PID_FILE" ]; then 
  PID=$(cat $MEMCACHED_PID_FILE) 
  rm -f ${MEMCACHED_PID_FILE} 
  if [ ! -z ${PID} ]; then 
   kill -9 ${PID} 
  fi 
  printf "memcached is stopped\n" 
 else 
  printf "no memcached running\n" 
 fi 
 
} 
 
 
case "$1" in 
 
 start) 
  start 
  ;; 
 
 stop) 
  stop 
  ;; 
 
 restart) 
  stop 
  sleep 3 
  start 
  ;; 
 
 *) 
  printf "Usage:$0 {start|stop|restart}\n" 
  exit 1 
 
esac 
 
exit 0

3.memcached_daemon.sh
监控memcached 进程,如进程失效则自动启动。

#!/bin/sh 
 
#memcached daemon 
 
ROOT=$(cd "$(dirname "$0")"; pwd) 
 
. ${ROOT}/memcached_inc.sh 
 
 
while : 
do 
 if [ -f "$MEMCACHED_PID_FILE" ] && [ -s "$MEMCACHED_PID_FILE" ]; then 
  PID=$(cat $MEMCACHED_PID_FILE) 
 else 
  PID="" 
 fi 
  
 if [ -z "$PID" ] || [ -z $(ps aux|awk '{print $2}' | grep "^$PID$") ]; then 
  $MEMCACHED 
  sleep 1 
  printf "[$(date +%Y-%m-%d' '%H:%M:%S)] ${SITE} ${HOST} memcached ${PORT} is restarted\n" >> $ERROR_LOG_FILE 
  echo "Subject: ${SITE} ${HOST} memcached ${PORT} is restarted $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail me@gmail.com 
 fi 
 
 sleep 5 
 
done 
 
exit 0

使用方法:

./gm_memcached.sh start #启动memcached 
./gm_memcached.sh stop #停止memcached 
./gm_memcached.sh restart #重启memcached

shell 记录apache status并自动更新到数据库
1. 获取apache status
monitor_log.sh

#!/bin/bash 
 
#连接数 
site_connects=$(netstat -ant | grep $ip:80 | wc -l) 
#当前连接数 
site_cur_connects=$(netstat -ant | grep $ip:80 | grep EST | wc -l) 
 
#apache 
apache_speed=$(netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}') 
 
printf "[#start#]\n$(date '+%Y-%m-%d %H:%M:%S')\n" 
printf "connects:${site_connects}\n" 
printf "cur connects:${site_cur_connects}\n" 
printf "apache_speed:\n${apache_speed}\n[#end#]\n\n" 
 
exit 0

在终端设置crontab执行

* * * * * /home/fdipzone/monitor_log.sh >> /home/fdipzone/monitor.log

2. 将apache status log 写入数据库
save_monitor_log.php

<?php 
 
$logfile = dirname(__FILE__).'/monitor.log'; 
 
$dbconfig = array( 
   'host' => '192.168.1.100', 
   'username' => 'username', 
   'password' => 'password', 
   'dbname' => 'mydb', 
   'tabname' => 'monitor_log' 
); 
 
$obj = new SaveMonitorLog($dbconfig, 'myweb'); 
$obj->load($logfile); 
 
 
// ?取monitor log,??入db,查看db 
class SaveMonitorLog{ // class start 
 
 private $_apache_state = array('TIME_WAIT', 'CLOSE_WAIT', 'SYN_SENT', 'SYN_RECV', 'FIN_WAIT1', 'FIN_WAIT2', 'ESTABLISHED', 'LAST_ACK', 'CLOSING'); 
 private $_dbconfig = array(); 
 private $_site = null; 
 
 
 /** init */ 
 public function __construct($dbconfig=array(), $site='web'){ 
  if(!isset($dbconfig['host']) || !isset($dbconfig['username']) || !isset($dbconfig['password']) || !isset($dbconfig['dbname']) || !isset($dbconfig['tabname'])){ 
   $this->debug('dbconfig error'); 
  } 
  $this->_dbconfig = $dbconfig; 
  $this->_site = $site; 
  $this->connectdb(); 
 } 
 
 
 /** load data 
 * @param String $logfile log文件 
 * @return boolean 
 */ 
 public function load($logfile){ 
 
  // ?取log?? 
  if(file_exists($logfile)){ 
   $logdata = file_get_contents($logfile); 
   // 清空monitor.log 
   file_put_contents($logfile, '', true); 
  }else{ 
   return false; 
  } 
 
  // 正?t分析?? [#start#]*[#end#] 
  preg_match_all('/
#start#
(.*?)
#end#
.*?/si', $logdata, $data); 
 
  if(isset($data[1]) && count($data[1])>0){ 
   $alldata = $data[1]; 
   foreach($alldata as $val){ 
    $indb = $this->parser($val); 
    $newid = $this->addtodb($indb); 
   } 
  } 
 
 } 
 
 
 /** parser data 
 * @param Array $data 
 * @return Array 
 */ 
 private function parser($data){ 
  $indb = array(); 
  $tmp = explode(chr(10), $data); // 按?Q行分隔 
 
  $indb['site'] = $this->_site; 
  $indb['addtime'] = $tmp[1]; 
  $indb['connects'] = array_pop(explode(':',$tmp[2])); 
  $indb['cur_connects'] = array_pop(explode(':',$tmp[3])); 
 
  for($i=5, $max=count($tmp)-2; $i<$max; $i++){ 
   list($key, $num) = explode(' ', $tmp[$i]); 
   if(in_array($key, $this->_apache_state)){ 
    $indb[$key] = $num; 
   } 
  } 
 
  return $indb; 
 } 
 
 
 /** connect db */ 
 private function connectdb(){ 
  $conn=@mysql_connect($this->_dbconfig['host'], $this->_dbconfig['username'], $this->_dbconfig['password']) or die(mysql_error()); 
  mysql_select_db($this->_dbconfig['dbname'], $conn) or die(mysql_error()); 
 } 
 
 
 /** add to db */ 
 private function addtodb($indb){ 
  $insertkey = ''; 
  $insertval = ''; 
  if($indb){ 
   foreach($indb as $key=>$val){ 
    $insertkey .= $insertkey? " ,".$key : $key; 
    $insertval .= $insertval? " ,'".mysql_escape_string(trim($val))."'" : "'".mysql_escape_string(trim($val))."'"; 
   } 
   $sqlstr = "insert into ".$this->_dbconfig['tabname']."($insertkey) values($insertval)"; 
   $query = @mysql_query($sqlstr) or die(mysql_error()); 
   $id = mysql_insert_id(); 
   return $id? $id : false; 
  } 
 } 
 
 
 /** debug */ 
 private function debug($msg){ 
  exit($msg."\r\n"); 
 } 
 
 
} // class end 
 
?>

在终端crontab执行

0 0 * * * php /home/fdipzone/save_monitor_log.php

 
table monitor_log struct

CREATE TABLE IF NOT EXISTS `monitor_log` ( 
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
 `site` varchar(20) NOT NULL, 
 `connects` int(10) unsigned NOT NULL DEFAULT '0', 
 `cur_connects` int(10) unsigned NOT NULL DEFAULT '0', 
 `TIME_WAIT` int(10) unsigned NOT NULL DEFAULT '0', 
 `CLOSE_WAIT` int(10) unsigned NOT NULL DEFAULT '0', 
 `SYN_SENT` int(10) unsigned NOT NULL DEFAULT '0', 
 `SYN_RECV` int(10) unsigned NOT NULL DEFAULT '0', 
 `FIN_WAIT1` int(10) unsigned NOT NULL DEFAULT '0', 
 `FIN_WAIT2` int(10) unsigned NOT NULL DEFAULT '0', 
 `ESTABLISHED` int(10) unsigned NOT NULL DEFAULT '0', 
 `LAST_ACK` int(10) unsigned NOT NULL DEFAULT '0', 
 `CLOSING` int(10) unsigned NOT NULL DEFAULT '0', 
 `addtime` datetime NOT NULL, 
 PRIMARY KEY (`id`), 
 KEY `connects` (`connects`), 
 KEY `cur_connects` (`cur_connects`), 
 KEY `TIME_WAIT` (`TIME_WAIT`), 
 KEY `CLOSE_WAIT` (`CLOSE_WAIT`), 
 KEY `SYN_SENT` (`SYN_SENT`), 
 KEY `SYN_RECV` (`SYN_RECV`), 
 KEY `FIN_WAIT1` (`FIN_WAIT1`), 
 KEY `FIN_WAIT2` (`FIN_WAIT2`), 
 KEY `ESTABLISHED` (`ESTABLISHED`), 
 KEY `LAST_ACK` (`LAST_ACK`), 
 KEY `CLOSING` (`CLOSING`), 
 KEY `addtime` (`addtime`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
PHP 相关文章推荐
第十四节 命名空间 [14]
Oct 09 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
使用php判断网页是否gzip压缩
Jun 25 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
怎样搭建PHP开发环境
Jul 28 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
ThinkPHP 5 AJAX跨域请求头设置实现过程解析
Oct 28 PHP
PHP批量去除BOM头内容信息代码
Mar 11 #PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 #PHP
php实现无限级分类查询(递归、非递归)
Mar 10 #PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 #PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 #PHP
PHP浮点数的一个常见问题
Mar 10 #PHP
简单谈谈php浮点数精确运算
Mar 10 #PHP
You might like
改变Apache端口等配置修改方法
2008/06/05 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
详解react-router如何实现按需加载
2017/06/15 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
python获取本机外网ip的方法
2015/04/15 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
Python子类继承父类构造函数详解
2019/02/19 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
Python打印不合法的文件名
2020/07/31 Python
python如何爬取动态网站
2020/09/09 Python
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
护士演讲稿范文
2014/01/05 职场文书
实习鉴定评语
2014/01/19 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
个人租房协议书样本
2014/10/01 职场文书
2014年客服工作总结范文
2014/11/13 职场文书