#!/bin/bash
#description: 服务巡检脚本
export PATH=/usr/local/nginx/sbin:/usr/local/apache/bin:/usr/local/mysql/bin:/usr/local/redis/bin:/usr/local/php/bin:$PATH
(type -a nc || yum install nc -y) &> /dev/null
create_mysql_auth(){
cat > $HOME/.my.cnf <<\EOF
[client]
user=
password=
port=3306
host=127.0.0.1
EOF
}
remove_mysql_auth(){
rm -f $HOME/.my.cnf
}
check_mysql(){
create_mysql_auth
mysqladmin ping &> /dev/null && return 0 || return 1
}
check_redis(){
nc -zv 127.0.0.1 6378 &> /dev/null && return 0 || return 1
}
check_crond(){
ps -C 'crond' &> /dev/null && return 0 || return 1
}
check_crond(){
pgrep crond &> /dev/null && return 0 || return 1
}
restart_nginx(){
if ps -C 'nginx' &> /dev/null; then
echo -n "stop nginx "
service nginx stop || pkill nginx || pkill -9 nginx || { echo "failed."; return 1; }
echo "successed."
sleep 3
fi
echo -n "start nginx "
service nginx start && { echo "successed."; return 0; } || { echo "failed."; return 2; }
}
restart_apache(){
if ps -C 'httpd' &> /dev/null; then
echo -n "stop httpd "
service httpd stop || pkill httpd || pkill -9 httpd || { echo "failed."; return 1; }
echo "successed."
sleep 3
fi
echo -n "start httpd "
service httpd start && { echo "successed."; return 0; } || { echo "failed."; return 2; }
}
restart_redis(){
if ps -C 'redis-server' &> /dev/null; then
echo -n "stop redis "
service Redis stop || pkill 'redis-server' || pkill -9 'redis-server' || { echo "failed."; return 1; } && { echo "successed."; sleep 3; }
fi
echo -n "start redis "
service Redis start && { echo "successed."; return 0; } || { echo "failed."; return 2; }
}
restart_mysql(){
if ps -C 'mysqld' &> /dev/null; then
echo -n "stop mysql "
service mysqld stop || pkill mysqld || { echo "failed." ; return 1; } && { echo "successed."; sleep 3; }
fi
echo -n "start mysql "
service mysqld start && { echo "successed."; return 0; } || { echo "failed."; return 2; }
}
check_local_all_sites(){
urls=`grep 'server_name' /usr/local/nginx/conf/nginx.conf | grep -Ev '#|\\$|rewrite' | sed -r 's#server_name\s+([^ ]+)(;| )(.*)#http://\1/#g' | sort -u`
let c=0
for url in ${urls[@]}; do
result=$(curl -m 20 --retry 3 -sk -L $url -w "%{http_code}|%{time_total}" -o /dev/null)
#只要存在一个站点不返回200, 则返回1
code=${result%|*}
total_time=${result#*|}
if [[ $code != "200" ]]; then
let c++
break
fi
done
return $c
}
main(){
check_local_all_sites || { restart_apache && restart_nginx; }
check_redis || restart_redis
check_mysql || restart_mysql
remove_mysql_auth
}
main