LVS+Keepalived DR模式(附脚本)
keepalived官方网站:http://www.keepalived.org/
Keepalived stable tarball
- Keepalived for Linux - Version 1.2.13 - May 13, 2014
以keepalived-1.2.13.tar.gz为例
说明:
1.配置好本地yum源,编译源码包会依赖相关库文件
2.把以下脚本和keepalived源码包放在相同目录
3.添加脚本的可执行权限
PS:脚本执行完毕后会直接将keepalived通过chkconifg加入开机启动,相关目录如下
/usr/local/src/keepalived-1.2.13 #keepalived源码解压目录,
/etc/keepalived/keepalived.conf #keepalived的主配置文件
/etc/sysconfig/keepalived #keepalived附加配置文件
/usr/sbin/keepalived #keepalived的二进制文件
/etc/init.d/keepalived #keepalived的自启动脚本,下面是截取致/etc/init.d/keepalived前面的部分脚本,
#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived
# Source function library
. /etc/rc.d/init.d/functions
# Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived
上面放大标红的部分是chkconfig keepalived on时在/etc/rc.d/rc{2,3,4,5}.d/这4个级别里生成的开机启动和关机停止顺序,也就是会生成如:/etc/rc.d/rc3.d/S21keepalived这个链接以便在3运行级别时在21这个顺序启动keepalived
我的实验环境如下:
OS:CentOS6.5 64bit
两台LVS调度器:
VIP:192.168.10.100
主(MASTER,优先级100): 192.168.10.101
备(BACKUP,优先级80): 192.168.10.102
查看调度结果, watch -n 1 ipvsadm -L -n
两台http服务器:
VIP:192.168.10.100
RealServer1:192.168.10.11
RealServer2:192.168.10.12
客户端:
CIP:192.168.10.2
压力测试, ab -n 10000 192.168.10.100/
下面是脚本源码定义的一些变量,有需要的可心自行修改。
注意:脚本2,脚本4是直接生成配置文件重启仍然生效,脚本3和脚本5只是当前生效重启后需再次运行。
#Define E-mail & Smtp_Server #定义keepalived.conf中global_defs{ }段中的通知邮箱及邮件SMTP服务器地址,为空则保持默认
Mail1=
Mail2=
Mail3=
Smtp_Server=
#Define keepalived "MASTER" or "BACKUP" #定义keepalived的主备和优先级
State_Flag=MASTER
State_Flag_Priority=100
#State_Flag=BACKUP
#State_Flag_Priority=80
#Define Virtual Server IP & Listen Port #定义VIP和监听端口
VIP1=192.168.10.100
VIP1_Listen_Port=80
VIP2=
VIP2_Listen_Port=
#Define Real Server IP & Listen Port #定义RIP和监听端口
VIP1_RIP1=192.168.10.11
VIP1_RIP1_Listen_Port=80
VIP1_RIP2=192.168.10.12
VIP1_RIP2_Listen_Port=80
VIP1_RIP3=
VIP1_RIP3_Listen_Port=
VIP2_RIP1=
VIP2_RIP1_Listen_Port=
VIP2_RIP2=
VIP2_RIP2_Listen_Port=
VIP2_RIP3=
VIP2_RIP3_Listen_Port=
#Define Weight #定义RIP权重
Weight_VIP1_RIP1=1
Weight_VIP1_RIP2=2
Weight_VIP1_RIP3=3
Weight_VIP2_RIP1=
Weight_VIP2_RIP2=
Weight_VIP2_RIP3=
#Define Schedule & Model #定义调度算法(静态算法rr, wrr, dh, sh;动态算法lc, wlc, sed, nq, lblc, lvlcr)和lvs包转发模型 (NAT|DR|TUN),具体的说明请自行man ipvsadm或者man keepalived.conf 以下是man ipvsadm的简单说明:
three packet-forwarding methods (NAT, tunneling, and direct routing), and eight loadbalancing algorithms (round robin, weighted round robin, least-connec-tion, weighted least-connection, locality-based least-connection, locality-based least-connection with replication, destination-hashing,and source-hashing).
Schedule_VIP1=wlc
Mode_VIP1=DR
Schedule_VIP2=
Mode_VIP2=
脚本1:调度器keepalived安装脚本源码:
############################################
#!/bin/bash
#To install keepalived automatically
#Made by liujun,2014/08/15
############################################
#Define system environment PATH
export PATH=$PATH
#Source function library
. /etc/rc.d/init.d/functions
#Define Keepalived Version
Keepalived_Version=1.2.13
Install_Directory=/usr/local/src
#Install the build-essential
PACKAGE="kernel-devel gcc openssl-devel popt-devel libnl-devel net-snmp-devel"
for i in $PACKAGE
do
FLAG=$(rpm -qa|grep -w $i)
if [ "$FLAG" == "" ];then
yum -y install $i
else
echo -e "\e[32;1m$i\e[0m is installed"
fi
done
echo -e "\n"
echo -e "... ...\n"
sleep 1
echo -e "... ...\n"
echo -e "\n"
#Build and install
tar -xvf keepalived-$Keepalived_Version.tar.gz -C /usr/local/src
cd /usr/local/src/keepalived-$Keepalived_Version
./configure \
--prefix=/usr \
--sysconf=/etc \
--with-kernel-dir=/usr/src/kernels/$(uname -r) \
--enable-snmp \
--enable-sha1
make && make install
echo -e "\n"
echo -e "\e[31;1mkeepalived\e[0m is \e[32;1minstalled\e[0m"
echo -e "\n"
#Autostart on init 3/5
#cp $Install_Directory/keepalived-$Keepalived_Version/keepalived/etc/init.d/keepalived.init /etc/rc.d/rc3.d/S99keepalived
#cp $Install_Directory/keepalived-$Keepalived_Version/keepalived/etc/init.d/keepalived.init /etc/rc.d/rc5.d/S99keepalived
chkconfig keepalived on
chkconfig --list keepalived
###################################################
##########################
#Build keepalived.conf
##########################
#Define E-mail & Smtp_Server
Mail1=
Mail2=
Mail3=
Smtp_Server=
#Define keepalived "MASTER" or "BACKUP"
State_Flag=MASTER
State_Flag_Priority=100
#State_Flag=BACKUP
#State_Flag_Priority=80
#Define Virtual Server IP & Listen Port
VIP1=192.168.10.100
VIP1_Listen_Port=80
VIP2=
VIP2_Listen_Port=
#Define Real Server IP & Listen Port
VIP1_RIP1=192.168.10.11
VIP1_RIP1_Listen_Port=80
VIP1_RIP2=192.168.10.12
VIP1_RIP2_Listen_Port=80
VIP1_RIP3=
VIP1_RIP3_Listen_Port=
VIP2_RIP1=
VIP2_RIP1_Listen_Port=
VIP2_RIP2=
VIP2_RIP2_Listen_Port=
VIP2_RIP3=
VIP2_RIP3_Listen_Port=
#Define Weight
Weight_VIP1_RIP1=1
Weight_VIP1_RIP2=2
Weight_VIP1_RIP3=3
Weight_VIP2_RIP1=
Weight_VIP2_RIP2=
Weight_VIP2_RIP3=
#Define Schedule & Model
Schedule_VIP1=wlc
Mode_VIP1=DR
Schedule_VIP2=
Mode_VIP2=
mv /etc/keepalived/keepalived.conf{,.bak}
cat >/etc/keepalived/keepalived.conf <<HERE
! Configuration File for keepalived
global_defs {
notification_email {
${Mail1:-acassen@firewall.loc}
${Mail2:-failover@firewall.loc}
${Mail3:-sysadmin@firewall.loc}
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server ${Smtp_Server:-192.168.200.1}
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state $State_Flag
interface eth0
virtual_router_id 51
priority $State_Flag_Priority
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
$VIP1
$VIP2
}
}
virtual_server $VIP1 $VIP1_Listen_Port {
delay_loop 6
lb_algo $Schedule_VIP1
lb_kind $Mode_VIP1
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server $VIP1_RIP1 $VIP1_RIP1_Listen_Port {
weight $Weight_VIP1_RIP1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server $VIP1_RIP2 $VIP1_RIP2_Listen_Port {
weight $Weight_VIP1_RIP2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
! real_server $VIP1_RIP3 $VIP1_RIP3_Listen_Port {
! weight $Weight_VIP1_RIP3
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
}
!virtual_server $VIP2 $VIP2_Listen_Port {
! delay_loop 6
! lb_algo $Schedule_VIP2
! lb_kind $Mode_VIP2
! nat_mask 255.255.255.0
! persistence_timeout 50
! protocol TCP
!
! real_server $VIP2_RIP1 $VIP2_RIP1_Listen_Port {
! weight $Weight_VIP2_RIP1
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
! real_server $VIP2_RIP2 $VIP2_RIP2_Listen_Port {
! weight $Weight_VIP2_RIP2
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
! real_server $VIP2_RIP3 $VIP1_RIP3_Listen_Port {
! weight $Weight_VIP2_RIP3
! TCP_CHECK {
! connect_timeout 3
! nb_get_retry 3
! delay_before_retry 3
! }
! }
!}
HERE
echo -e "\n"
/etc/init.d/keepalived start
sleep 1
echo -e "\n"
/etc/init.d/keepalived restart
###################################################
脚本2:调度器子接口及路由配置脚本(永久生效)
############################################
#!/bin/bash
#To contribute to lvs_dr
#Made by liujun,2014/08/11
############################################
#Define system environment PATH
export PATH=$PATH
#Source function library
. /etc/rc.d/init.d/functions
#Define Variable
Sysconfig_Dir=/etc/sysconfig/network-scripts
VIP=192.168.10.100
Eth=lo
Eth_Child_Num=0
#################
#Define functions
#################
network_restart() {
echo -e "\e[31;1mNetworking\e[0m \e[32;1mrestart\e[0m\n"
/etc/init.d/network restart
}
start_begin() {
echo -e "\e[31;1mActiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mAdding\e[0m route rules to \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mChanging\e[0m \e[32;1mkernel args\e[0m\n"
echo -e "... ..."
sleep 0.5
}
start_end() {
sleep 0.5
echo -e "\n"
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1mactived!\e[0m\n$(ifconfig $Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep arp_)"
}
stop_begin() {
echo -e "\e[31;1mRemoving\e[0m route rules from \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mInactiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mRestoring\e[0m \e[32;1mkernel args\e[0m\n"
echo -e "... ..."
}
stop_end() {
sleep 0.5
echo -e "\n"
echo -e "The \e[31;1mroute rules\e[0m is \e[32;1mremoved\e[0m\r"
echo -e "The ifcfg-\e[31;1m$Eth:$Eth_Child_Num\e[0m is \e[32;1minactived\e[0m\r"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mrestored!\e[0m\n$(sysctl -p >/dev/null 2>&1|grep arp_)"
sleep 0.5
}
status() {
echo -e "\n"
if [ "$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == "" ];then
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1minactived!\e[0m\n"
echo -e "\e[31;1mNo route \e[0m to \e[32;1m$Eth:$Eth_Child_Num\e[0m\n"
echo -e "\e[31;1mKernel args\e[0m is \e[32;1mrequired!\e[0m\n"
else
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1mactived!\e[0m\n$(ifconfig $Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep arp_)"
fi
}
start() {
#Build /etc/sysconfig/network-scripts/ifcfg-lo:0
start_begin
if ! [ -f $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num ];then
cat > $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num <<HERE
DEVICE=$Eth:$Eth_Child_Num
BOOTPROTO=static
IPADDR=$VIP
NETMASK=255.255.255.255
BROADCAST=$VIP
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
HERE
fi
#Build /etc/sysconfig/network-scripts/route-lo:0
if ! [ -f $Sysconfig_Dir/route-$Eth:$Eth_Child_Num ];then
cat >$Sysconfig_Dir/route-$Eth:$Eth_Child_Num <<HERE
$VIP dev $Eth:$Eth_Child_Num
HERE
fi
#Modify kernel args
if [ "$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == "" ];then
echo "
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2">>/etc/sysctl.conf
fi
network_restart
start_end
}
stop() {
stop_begin
rm -rf $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num >/dev/null 2>&1
rm -rf $Sysconfig_Dir/route-$Eth:$Eth_Child_Num >/dev/null 2>&1
sed -i '/net.ipv4.conf.lo.arp_ignore = 1/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.all.arp_ignore = 1/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.lo.arp_announce = 2/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.all.arp_announce = 2/ d' /etc/sysctl.conf
stop_end
network_restart
}
#How to use
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
echo -e "########################################################"
echo -e "\n\n\n\n\n\n\n\n\n"
echo -e "########################################################"
start
;;
status)
status
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m \e[34;1m{start|stop|restart|status}\e[0m"
exit 1
;;
esac
exit $?
脚本3:调度器子接口及路由配置脚本(临时生效)
############################################
#!/bin/bash
#To contribute to lvs_dr
#Made by liujun,2014/08/11
############################################
#Define system environment PATH
export PATH=$PATH
#Source function library
. /etc/rc.d/init.d/functions
VIP=192.168.10.100
#Define function
start() {
ifconfig eth0:0 $VIP netmask 255.255.255.255 broadcast $VIP up
route add -host $VIP dev eth0:0
echo -e "Derector \e[32;1mstarted\e[0m"
}
stop() {
route del -host $VIP dev eth0:0
ifconfig eth0:0 down
echo -e "Derector \e[31;1mstopped\e[0m"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m \e[34;1m{start|stop|restart}\e[0m"
exit 1
;;
esac
exit $?
脚本4:RealServer子接口,路由配置及内核参数修改脚本(永久生效)
############################################
#!/bin/bash
#modify kernel args to contribute to lvs_dr
#Made by liujun,2014/08/11
############################################
#Define system environment PATH
export PATH=$PATH
#Source function library
. /etc/rc.d/init.d/functions
#Define Variable
Sysconfig_Dir=/etc/sysconfig/network-scripts
VIP=192.168.10.100
Eth=lo
Eth_Child_Num=0
#################
#Define functions
#################
network_restart() {
echo -e "\e[31;1mNetworking\e[0m \e[32;1mrestart\e[0m\n"
/etc/init.d/network restart
}
start_begin() {
echo -e "\e[31;1mActiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mAdding\e[0m route rules to \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mChanging\e[0m \e[32;1mkernel args\e[0m\n"
echo -e "... ..."
sleep 0.5
}
start_end() {
sleep 0.5
echo -e "\n"
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1mactived!\e[0m\n$(ifconfig $Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep arp_)"
}
stop_begin() {
echo -e "\e[31;1mRemoving\e[0m route rules from \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mInactiving\e[0m \e[32;1m$Eth:$Eth_Child_Num\e[0m\r"
sleep 0.5
echo -e "\e[31;1mRestoring\e[0m \e[32;1mkernel args\e[0m\n"
echo -e "... ..."
}
stop_end() {
sleep 0.5
echo -e "\n"
echo -e "The \e[31;1mroute rules\e[0m is \e[32;1mremoved\e[0m\r"
echo -e "The ifcfg-\e[31;1m$Eth:$Eth_Child_Num\e[0m is \e[32;1minactived\e[0m\r"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mrestored!\e[0m\n$(sysctl -p >/dev/null 2>&1|grep arp_)"
sleep 0.5
}
status() {
echo -e "\n"
if [ "$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == "" ];then
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1minactived!\e[0m\n"
echo -e "\e[31;1mNo route \e[0m to \e[32;1m$Eth:$Eth_Child_Num\e[0m\n"
echo -e "\e[31;1mKernel args\e[0m is \e[32;1mrequired!\e[0m\n"
else
echo -e "ifcfg-\e[32;1m$Eth:$Eth_Child_Num\e[0m is \e[31;1mactived!\e[0m\n$(ifconfig $Eth:$Eth_Child_Num)"
echo -e "\e[31;1mRoute rules\e[0m is \e[32;1mcreated\e[0m\n$(route -ne|grep $VIP)"
echo -e "\e[31;1mKernel args\e[0m has been \e[32;1mattached!\e[0m\n$(sysctl -p 2>/dev/null|grep arp_)"
fi
}
start() {
#Build /etc/sysconfig/network-scripts/ifcfg-lo:0
start_begin
if ! [ -f $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num ];then
cat > $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num <<HERE
DEVICE=$Eth:$Eth_Child_Num
BOOTPROTO=static
IPADDR=$VIP
NETMASK=255.255.255.255
BROADCAST=$VIP
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
HERE
fi
#Build /etc/sysconfig/network-scripts/route-lo:0
if ! [ -f $Sysconfig_Dir/route-$Eth:$Eth_Child_Num ];then
cat >$Sysconfig_Dir/route-$Eth:$Eth_Child_Num <<HERE
$VIP dev $Eth:$Eth_Child_Num
HERE
fi
#Modify kernel args
if [ "$(grep net.ipv4.conf.lo.arp_ignore /etc/sysctl.conf)" == "" ];then
echo "
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2">>/etc/sysctl.conf
fi
network_restart
start_end
}
stop() {
stop_begin
rm -rf $Sysconfig_Dir/ifcfg-$Eth:$Eth_Child_Num >/dev/null 2>&1
rm -rf $Sysconfig_Dir/route-$Eth:$Eth_Child_Num >/dev/null 2>&1
sed -i '/net.ipv4.conf.lo.arp_ignore = 1/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.all.arp_ignore = 1/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.lo.arp_announce = 2/ d' /etc/sysctl.conf
sed -i '/net.ipv4.conf.all.arp_announce = 2/ d' /etc/sysctl.conf
stop_end
network_restart
}
#How to use
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
echo -e "########################################################"
echo -e "\n\n\n\n\n\n\n\n\n"
echo -e "########################################################"
start
;;
status)
status
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m \e[34;1m{start|stop|restart|status}\e[0m"
exit 1
;;
esac
exit $?
脚本5:RealServer子接口,路由配置及内核参数修改脚本(临时生效)
############################################
#!/bin/bash
#modify kernel args to contribute to lvs_dr
#Made by liujun,2014/08/11
############################################
#Define system environment PATH
export PATH=$PATH
#Source function library
. /etc/rc.d/init.d/functions
VIP=192.168.10.100
#Define function
start() {
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up >/dev/null 2>&1
route add -host $VIP dev lo:0 >/dev/null 2>&1
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo -e "RealServer \e[32;1mstarted\e[0m"
}
stop() {
route del -host $VIP dev lo:0 >/dev/null 2>&1
ifconfig lo:0 down >/dev/null 2>&1
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo -e "RealServer \e[31;1mstopped\e[0m"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
*)
echo -e "\e[32;1mUsage:\e[0m \e[33;1m$0\e[0m \e[34;1m{start|stop|restart}\e[0m"
exit 1
;;
esac
exit $?