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

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 runningn"
else
printf
"starting memcachedn"
$MEMCACHED
sleep
2
PID=$(
cat
$MEMCACHED_PID_FILE)
printf
"memcached is started PID:$PIDn"
printf
"starting memcached daemonn"
${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 stoppedn"
else
printf
"no memcached daemon runningn"
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 stoppedn"
else
printf
"no memcached runningn"
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
#!/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 runningn"
 
else
  
printf
"starting memcachedn"
  
$MEMCACHED
 
  
sleep
2
 
  
PID=$(
cat
$MEMCACHED_PID_FILE)
  
printf
"memcached is started PID:$PIDn"
 
  
printf
"starting memcached daemonn"
  
${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 stoppedn"
 
else
  
printf
"no memcached daemon runningn"
 
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 stoppedn"
 
else
  
printf
"no memcached runningn"
 
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 restartedn"
>> $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#]nn"
 
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;
  
}
 
  
// 正則分析數據 [#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
);
// 按換行分隔
 
  
$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
.
"rn"
);
 
}
 
 
}
// 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 ;
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论