爛泥:學習tomcat之通過shell批量管理多個tomcat

来源:http://www.cnblogs.com/ilanni/archive/2016/01/23/5153035.html
-Advertisement-
Play Games

本文由ilanniweb提供友情贊助,首發於爛泥行天下想要獲得更多的文章,可以關註我的微信ilanniweb公司的業務是使用tomcat做web容器,為了更有效的利用伺服器的性能,我們一般部署多個tomcat做業務的負載均衡。一、業務需求目前一臺伺服器上,部署了4個tomcat,也就相當於4個節點。...


本文由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實例的工作目錄。如下:

lip_image001[4]

我們需要把每一個tomcat實例server.xml配置文件的appBase配置項,修改為/app/tomcat/apiwebapps。

以上修改完畢後,我們需要創建/app/tomcat/apiwebapps目錄。

mkdir -p /app/tomcat/apiwebapps

tree -L 3 /app/

lip_image002[4]

現在我們可以查看node1為例,查看該tomcat實例的目錄結構,如下:

tree -L 1 ./node1

lip_image003[4]

註意:這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

lip_image004[4]

3.2 修改ilanni.sh文件許可權

ilanni.sh腳本創建完畢後,現在我們來修改ilanni.sh的執行許可權。如下:

chmod +x ilanni.sh

lip_image005[4]

四、啟動與關閉tomcat

ilanni.sh許可權修改完畢之後,我們就可以來啟動這4個tomcat實例了。比如現在想啟動node1和node2這兩個實例,我們可以通過以下命令來啟動。

./ilanni.sh p2 start

./ilanni.sh p2 status

lip_image006[4]

通過上圖,可以很明顯的看出實例node1、node2已經啟動了。

tomcat啟動後,如果要停止的話,我們可以使用如下命令:

./ilanni.sh p2 stop

lip_image007[4]

通過上圖,我們可以看到,我們已經把實例node1、node2停掉了,而且我們也刪除了實例node1、node2的緩存。

以上我們是以啟動兩個tomcat實例為例的,如果啟動或者關閉是一個、三個以及所有tomcat實例的話,我們可以使用如下命令。

./ilanni.sh p1 start

lip_image008[4]

./ilanni.sh p3 start

./ilanni.sh all start

當然相應的關閉、重啟和查看狀態命令,分別如下。

關閉命令:

./ilanni.sh p1 stop

lip_image009[4]

./ilanni.sh p3 stop

./ilanni.sh all stop

查看狀態命令:

./ilanni.sh p1 status

lip_image010[4]

./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

lip_image011[4]

查看是否已添加進服務列表

chkconfig --list |grep ilanni

lip_image012[4]

添加到服務以後, 就可以這樣以服務方式來啟動和停止、重啟tomcat實例了。如下:

/etc/init.d/ilanni p2 start

/etc/init.d/ilanni p2 status

lip_image013[4]

通過上圖,我們可以出,ilanni.sh腳本已經就加入到系統服務之中了。

到此有關通過shell批量管理tomcat的文章就結束了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 簡介說明 我們知道oracle中sqlplus裡面執行dml語句;是需要提交commit;若錯了;也可以回滾rollback; 然而在postgresql裡面預設是自動提交;執行完就馬上提交了,不能回滾,這樣容易導致誤操作的發生,有沒有什麼辦法避免這個風險呢?當然有,在psql中預設是...
  • SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。SQL Server代理作業有一系列的一個或多個作業步驟組成。一個作業步驟會分配給特定的作業子系統,用來標識將要進行的作業步驟工作種類。每個作業...
  • 1、use_concat網上說法:CONCATENATION和UNION/UNION ALL操作比較類似,根據OR查詢條件,將一個查詢分解為兩個或更多的部分,然後在去掉兩個部分重覆的記錄。由於CONCATENATION執行計劃需要去掉重覆的記錄,因此和UNION ALL不同。和UNION也不同的是,...
  • 近期為了分析國內航空旅游業常見安全漏洞,想到了用大數據來分析,其實數據也不大,只是生產項目沒有使用Hadoop,因此這裡實際使用一次。先看一下通過hadoop分析後的結果吧,最終通過hadoop分析國內典型航空旅游業廠商的常見安全漏洞個數的比例效果如下:第一次正式使用Hadoop,肯定會遇到非常多的...
  • 常用操作: 整型類型操作: 1、相加__add__(),比如我有兩個變數a=19,b=20,那麼我想通過a調用此函數來與b相加,可以這樣做1 >>> a=192 >>> b=203 >>> c=-194 >>> d=a.__add__(b)5 >>> print d6 39也可以直接相加1 >>>....
  • 1. 安裝環境 linux版本:CentOSrelease6.2(Final) pg版本 :postgresql-9.5.02. pg資料庫下載地址--http://www.postgresql.org/ftp/source/3. 安裝依賴包>yum installgcc*>yum insta...
  • 前言今天在在清理資料庫,是MS SQL Server,其中用到分離資料庫文件。在這過程中,出現了一個小小的問題:誤將資料庫日誌文件刪除了,然後數據就打不開了,除了離線,其他操作都報錯。資料庫分離常規方法此方法是常規慣用的方式,多步驟。如圖所示:粗暴方法此方法簡單粗暴,非常實用,一條SQL語句就搞定了...
  • 一直想在 Linux 上使用 MONO 試試運行 Rafy,最近因為業務需要,總算是真正地試驗了一次。下麵是本次部署記錄的一些要點。 Linux 這次部署,我是和兩位同事一起來試驗的。由於我們對 Linux 都不太熟悉(多年前曾經用過很少一段時間的 RedHat,那些命令現在也早已忘記了,哈。),所...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...