烂泥:学习tomcat之通过shell批量管理多个tomcat
本文由ilanniweb提供友情赞助,首发于烂泥行天下
想要获得更多的文章,可以关注我的微信ilanniweb
公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个tomcat做业务的负载均衡。
一、业务需求
目前一台服务器上,部署了4个tomcat,也就相当于4个节点。平时在维护业务时,需要我们一个一个tomcat实例进行单独的维护,感觉很不方便,所以就有了这篇文章。
但是为了更方便的管理这4个tomcat,我这边做了两方面的工作,一是把所有的tomcat工作目录都指向另外单独的一个目录下,二是通过shell来启动、关闭和重启tomcat。
PS:本次实验的测试OS为centos6.5 64bit,但是shell脚本也可以在ubuntu下使用。
二、修改tomcat工作目录
为了不一个一个单独的维护tomcat实例,首先我们来修改tomcat实例的工作目录。所有的tomcat配置文件位于conf目录下的server.xml文件。
我们只需要修改server.xml文件的appBase配置项,这样就可以指定tomcat实例的工作目录。如下:

我们需要把每一个tomcat实例server.xml配置文件的appBase配置项,修改为/app/tomcat/apiwebapps。
以上修改完毕后,我们需要创建/app/tomcat/apiwebapps目录。
mkdir -p /app/tomcat/apiwebapps
tree -L 3 /app/

现在我们可以查看node1为例,查看该tomcat实例的目录结构,如下:
tree -L 1 ./node1

注意:这4个tomcat所监听的端口是不同的,否则无法启动tomcat。
有关tomcat的单机多实例,可以看我的下一篇文章《烂泥:学习tomcat之tomcat单机多实例》。
三、创建shell脚本
现在我是把4个tomcat实例都放到/app/tomcat目录下, 这4个tomcat实例目录名称分别为node1、node2、node3、node4。 可以看出这4个tomcat实例的命名规则为node${i}。现在开始编写shell脚本。
3.1 新建ilanni.sh脚本
新建一个shell文件命名为 ilanni.sh,内容如下:
#!/bin/bash
# Apache Tomcat daemon
# chkconfig: 345 10 10
# description: Apache Tomcat daemon
# processname: tomcat
echo " ______ __ "
echo " /_ __/___ ____ ___ _________ _/ /_ "
echo " / / / __ \/ __ __ \/ ___/ __ / __/ "
echo " / / / /_/ / / / / / / /__/ /_/ / /_ "
echo "/_/ \____/_/ /_/ /_/\___/\__,_/\__/ "
echo " "
#定义JAVA_HOME
export JAVA_HOME=/usr/local/java/jdk1.7.0_80
#定义多个tomcat的总目录,/app/tomcat目录下有node1、node2、node3、node4 四个tomcat实例。
tom="/app/tomcat/node"
#定义启动脚本路径
startup_bin="bin/startup.sh"
#定义tomcat的启动方式,启动方式为tomcat.sh p1 start类似的命令
usage="{p1|p2|p3|all} {start|stop|restart|status}"
dev="/dev/null"
#定义如何启动tomcat,在此我们是通过个数tomcat以及前面定义的tomcat的命令,来操作tomcat
#judge $1 $2 whether null
if [ "$1" == "" -o "$2" == "" ];then
echo
echo "Usage: $0 $usage"
echo
exit 1
fi
#judge $1
case $1 in
"p1")
tomcats="1"
;;
"p2")
tomcats="1 2"
;;
"p3")
tomcats="1 2 3"
;;
"all")
tomcats="1 2 3 4"
;;
*)
echo "Usage: $0 $usage"
;;
esac
#定义tomcat的启动
#define start function
tomcatstart() {
for i in $tomcats
do
tom_home="$tom$i"
run_status=$(ps -ef | grep -v 'grep' | egrep "java.*=${tom_home}")
if [ "${run_status}X" != "X" ];then
echo "node$i is already running..."
else
${tom_home}/${startup_bin} &>$dev
echo "node$i starting,Please wait 2s..."
sleep 2
fi
done
}
#定义tomcat的关闭
#define stop function
tomcatstop() {
for j in $tomcats
do
tom1_home="$tom$j"
tomcat_pid=$(ps -ef | grep ${tom1_home} | grep "org.apache.catalina.startup.Bootstrap start" | awk '{printf $2}')
if [ "${tomcat_pid}X" == "X" ];then
echo "node$j is not running..."
else
kill -9 ${tomcat_pid} & >$dev
echo "node$j stopping,Please wait 1s..."
sleep 1
echo "delte node$j cache,Please wait 1s..."
rm -rf ${tom1_home}/work/*
fi
done
}
#定义tomcat的重启
#define restart function
tomcatrestart() {
for m in $tomcats
do
tom2_home="$tom$m"
run2_status=$(ps -ef | grep -v 'grep' | egrep "java.*=${tom2_home}")
if [ "${run2_status}X" == "X" ];then
echo "node$m is not running..."
${tom2_home}/${startup_bin} &>$dev
echo "node$m starting,Please wait 2s..."
sleep 2
else
ps -ef | grep ${tom2_home} | grep "org.apache.catalina.startup.Bootstrap start" | awk '{printf $2}'| xargs kill -9 >$dev
echo "node$m stopping,Please wait 2s..."
sleep 1
${tom2_home}/${startup_bin} &>$dev
echo "node$m starting,Please wait 2s..."
sleep 2
fi
done
}
#定义tomcat的状态
#define status function
tomcatstatus() {
for n in $tomcats
do
tom3_home="$tom$n"
run3_status=$(ps -ef | grep -v 'grep' | egrep "java.*=${tom3_home}")
if [ "${run3_status}X" == "X" ];then
echo "node$n is not running..."
else
echo "node$n is running"
fi
done
}
#judge $2
case $2 in
"start")
tomcatstart
;;
"stop")
tomcatstop
;;
"restart")
tomcatrestart
;;
"status")
tomcatstatus
;;
*)
echo "Usage: $0 $usage"
;;
esac

3.2 修改ilanni.sh文件权限
ilanni.sh脚本创建完毕后,现在我们来修改ilanni.sh的执行权限。如下:
chmod +x ilanni.sh

四、启动与关闭tomcat
ilanni.sh权限修改完毕之后,我们就可以来启动这4个tomcat实例了。比如现在想启动node1和node2这两个实例,我们可以通过以下命令来启动。
./ilanni.sh p2 start
./ilanni.sh p2 status

通过上图,可以很明显的看出实例node1、node2已经启动了。
tomcat启动后,如果要停止的话,我们可以使用如下命令:
./ilanni.sh p2 stop

通过上图,我们可以看到,我们已经把实例node1、node2停掉了,而且我们也删除了实例node1、node2的缓存。
以上我们是以启动两个tomcat实例为例的,如果启动或者关闭是一个、三个以及所有tomcat实例的话,我们可以使用如下命令。
./ilanni.sh p1 start

./ilanni.sh p3 start
./ilanni.sh all start
当然相应的关闭、重启和查看状态命令,分别如下。
关闭命令:
./ilanni.sh p1 stop

./ilanni.sh p3 stop
./ilanni.sh all stop
查看状态命令:
./ilanni.sh p1 status

./ilanni.sh p3 status
./ilanni.sh all status
注意:该shell脚本只能按照node1、node2、node3、node4等依次执行下去,不能单独的停止和启动tomcat实例,除node1外。
五、把ilanni脚本加入系统服务
为了操作更方便,我们可以把ilanni.sh这个脚本加入到系统服务中。具体操作方法如下:
cp ilanni.sh /etc/init.d/ilanni
chkconfig --add /etc/init.d/ilanni
chkconfig ilanni on

查看是否已添加进服务列表
chkconfig --list |grep ilanni

添加到服务以后, 就可以这样以服务方式来启动和停止、重启tomcat实例了。如下:
/etc/init.d/ilanni p2 start
/etc/init.d/ilanni p2 status

通过上图,我们可以出,ilanni.sh脚本已经就加入到系统服务之中了。
到此有关通过shell批量管理tomcat的文章就结束了。
烂泥:学习tomcat之通过shell批量管理多个tomcat的更多相关文章
- 基于CentOS的MySQL学习补充三--使用Shell批量创建数据库表
本文出处:http://blog.csdn.net/u012377333/article/details/47006087 接上篇介绍<基于CentOS的Mysql学习补充二--使用Shell创 ...
- 基于CentOS的MySQL学习补充四--使用Shell批量从CSV文件里插入数据到数据表
本文出处:http://blog.csdn.net/u012377333/article/details/47022699 从上面的几篇文章中,能够知道怎样使用Shell创建数据库.使用Shell创建 ...
- Shell批量启动、关闭tomcat
批量启动tomcat脚本,配置NUM可控制启动数量 #!/bin/bash #identifier CLUSTER_HOME=/opt/cluster-tomcat TNAME=tomcat-- TP ...
- Fabric 源码学习:如何实现批量管理远程服务器?
前不久,我写了一篇<Fabric教程>,简单来说,它是一个用 Python 开发的轻量级的远程系统管理工具,在远程登录服务器.执行 Shell 命令.批量管理服务器.远程部署等场景中,十分 ...
- Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 尚未授予访问 Tomcat 服务器的权限。请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用户名和口令。 有关详细信息, 请查看服务器日志。
错误描述: 发布时控制台出现: 部署错误: 尚未授予访问 Tomcat 服务器的权限.请在服务器管理器的 Tomcat 定制器中设置 "manager-script" 角色的正确用 ...
- Linux-ansible批量管理
1.ansible批量管理服务概念 (1)是基于Python语言开发的自动化软件工具 (2)是基于SSH远程管理服务实现远程主机批量管理 2.ansible批量管理服务意义 (1)提高工作的效率 (2 ...
- windows下运行的linux服务器批量管理工具(带UI界面)
产生背景: 由于做服务器运维方面的工作,需要一人对近千台LINUX服务器进行统一集中的管理,如同时批量对LINUX服务器执行相关的指令.同时批量对LINUX服务器upload程序包.同时批量对LINU ...
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- 【Python之旅】第六篇(七):开发简易主机批量管理工具
[Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...
随机推荐
- PHP连接SQL Server相关配置及说明
关于php怎么连接数据库,大家肯定有不同的看法,有的用wamp,有的用xamp,他们都是集成环境,方便操作.但有时,数据库的类型不同,要连接不同的数据库.今天和大家分享一下如何连接sql2000,服 ...
- 【Java】记录一次代码优化
前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:) 标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...
- 程序集与反射技术(C#)
首先我们来看程序集,程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件.exe和类库文件.dll).由于程序集在编译后并不一定会生成单个文件,而可能会生 ...
- css3+visbibilty解决淡入淡出问题
.fade{ visibility: hidden; opacity: ; transition: all .5s; } .fade.on { visibility: visible; opacity ...
- 用Javascript模拟微信飞机大战游戏
最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...
- 自己实现简单的AOP(一)简介
AOP 和 OOP,在我看来是两种相辅相成的技术,作为OOP的补充,AOP 有着自己特殊的应用场景. 假设,我们需要在Service层实现以下几项基本功能: /// <para>1.自动管 ...
- C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理
在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...
- C#~异步编程续~.net4.5主推的await&async应用
返回目录 之前写过两篇关于异步编程的文章,详细可以进入C#~异步编程和C#~异步编程在项目中的使用 .net的各个版本都有自己主推的技术,像.NET1.1中的委托,.NET2.0中的泛型,.NET3. ...
- C#代码精确到毫秒时间戳写法
TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); ts.TotalMilliseconds;
- Java 9将采用新的版本字符串格式
在现有的版本编码格式使用了两年之后,从Java 9开始,Java版本方案将根据业内软件版本编码的最佳实践进行修改.使用或解析Java版本字符串的应用程序开发人员要注意了,因为这种变化 ...