linux 腳本解釋

if [ $? -ne 0 ]; then

echo "錯誤: 無法關閉現有 Tomcat 實例,終止啟動流程!" >&2

exit 1

fi

  1. $??是shell中的特殊變量,表示上一個命令的退出狀態碼
  2. -ne 0?表示"不等于0"(在Unix/Linux中,0通常表示成功,非0表示錯誤)
  3. 如果前一個命令執行失敗(返回非0),則執行花括號內的內容:
    • 輸出錯誤信息到標準錯誤輸出(stderr)
    • 使用exit 1終止腳本執行并返回錯誤狀態碼1

--------------------------------------------------------------------------------------------------

if [ -z "$1" ]; then
echo "用法: $0 <TOMCAT_DIRECTORY>"
exit 1
fi

具體解釋如下:

  1. if [ -z "$1" ]?檢查第一個參數($1)是否為空字符串

    • -z?測試字符串長度是否為0
    • $1?表示腳本的第一個參數
  2. 如果參數為空(即用戶沒有提供參數),則:

    • 輸出用法提示:echo "用法: $0 <TOMCAT_DIRECTORY>"
      • $0?表示當前腳本的名稱
    • 以狀態碼1退出腳本:exit 1?(1通常表示錯誤退出)

---------------------------------------------------------------------------------------------------

TOMCAT_DIR="$1"
TIMEOUT=10
TOMCAT=$(basename "${TOMCAT_DIR}")
CURRENT_USER=$(whoami)

以下是詳細解釋:

  1. TOMCAT_DIR="$1"

    • 將腳本的第一個參數($1)賦值給變量TOMCAT_DIR
    • 這個參數應該是Tomcat的安裝目錄路徑
  2. TIMEOUT=10

    • 設置超時時間為10秒
    • 用于后續等待Tomcat關閉的時間控制
  3. TOMCAT=$(basename "${TOMCAT_DIR}")

    • 使用basename命令從目錄路徑中提取最后一級目錄名
    • 例如:如果TOMCAT_DIR/opt/apache-tomcat-9.0.45,則TOMCAT值為apache-tomcat-9.0.45
  4. CURRENT_USER=$(whoami)

    • 獲取當前執行腳本的用戶名
    • 用于后續的權限檢查和日志記錄

-------------------------------------------------------------------------------------------------------------

# 檢查目錄和腳本存在性
[ ! -d "${TOMCAT_DIR}" ] && echo "錯誤: 目錄不存在" && exit 1
[ ! -x "${TOMCAT_DIR}/bin/shutdown.sh" ] && echo "錯誤: shutdown.sh 不可執行" && exit 1

# 獲取 Tomcat 主進程 PID(精確匹配)
get_pids() {
ps -ef | grep "${TOMCAT}" | grep "org.apache.catalina.startup.Bootstrap" | grep -v grep | awk '{print $2}'
}

詳細解釋它們的功能和實現原理:

  1. 目錄和腳本存在性檢查部分:

    • [ ! -d "${TOMCAT_DIR}" ]:檢查指定的Tomcat目錄是否存在
      • -d測試目錄是否存在
      • !表示邏輯非
    • [ ! -x "${TOMCAT_DIR}/bin/shutdown.sh" ]:檢查shutdown.sh腳本是否存在且可執行
      • -x測試文件是否存在且可執行
    • 如果任一檢查失敗,會輸出錯誤信息并以狀態碼1退出
  2. 獲取Tomcat進程PID的函數:

    • ps -ef:列出所有進程的完整信息
    • grep "${TOMCAT}":過濾包含Tomcat目錄名的進程
    • grep "org.apache.catalina.startup.Bootstrap":精確匹配Tomcat主類
    • grep -v grep:排除grep命令自身的進程
    • awk '{print $2}':提取第二列(即PID)
    • 這個函數通過多級過濾確保只獲取真正的Tomcat主進程PID

----------------------------------------------------------------------------------------------------------------

# 初始檢查進程
PIDS=$(get_pids)
if [ -z "${PIDS}" ]; then
echo "Tomcat 未運行,無需關閉"
exit 0
fi

echo "檢測到 Tomcat 進程 (PID: ${PIDS})"

# 步驟1:嘗試優雅關閉(忽略非關鍵錯誤,但記錄)
echo "嘗試優雅關閉..."
if ! ${TOMCAT_DIR}/bin/shutdown.sh; then
echo "警告: shutdown.sh 執行失敗(可能權限不足)"
fi

# 等待優雅關閉
echo "等待 ${TIMEOUT} 秒..."
sleep ${TIMEOUT}

詳細解析:

  1. 初始進程檢查:

    • 調用get_pids函數獲取Tomcat進程PID
    • 如果PID為空(-z測試),輸出提示并正常退出(exit 0)
    • 否則顯示檢測到的進程PID
  2. 優雅關閉流程:

    • 首先嘗試執行Tomcat的shutdown.sh腳本
    • 使用if ! command結構捕獲執行失敗情況
    • 即使失敗也僅輸出警告而不終止(因為后續還有強制關閉邏輯)
  3. 等待處理:

    • 使用sleep命令等待預設的TIMEOUT時間(之前定義為10秒)
    • 這是給Tomcat完成正常關閉流程的時間窗口

----------------------------------------------------------------------------------------------------------

# 步驟2:檢查是否仍有進程
PIDS=$(get_pids)
if [ -n "${PIDS}" ]; then
echo "嘗試正常終止進程 (PID: ${PIDS})"
# 逐個檢查并終止進程,記錄失敗
for pid in ${PIDS}; do
# 檢查進程所有者
PROCESS_OWNER=$(ps -o user= -p "${pid}" 2>/dev/null || echo "unknown")
echo "進程 ${pid} 所有者: ${PROCESS_OWNER}"

# 嘗試終止進程
if ! kill "${pid}" 2>/dev/null; then
echo "錯誤: 無法終止進程 ${pid}(權限不足,當前用戶 ${CURRENT_USER} 無法操作 ${PROCESS_OWNER} 的進程)"
exit 1 ?# 權限不足時立即報錯退出
fi
done

? ? # 等待后再次檢查
sleep 5
PIDS=$(get_pids)
if [ -n "${PIDS}" ]; then
echo "嘗試強制終止進程 (PID: ${PIDS})"
for pid in ${PIDS}; do
if ! kill -9 "${pid}" 2>/dev/null; then
echo "錯誤: 無法強制終止進程 ${pid}(權限不足)"
exit 1 ?# 權限不足時立即報錯退出
fi
done
fi
fi

# 最終檢查
PIDS=$(get_pids)
if [ -z "${PIDS}" ]; then
echo "Tomcat 已成功關閉"
else
echo "錯誤: 仍有進程未關閉 (PID: ${PIDS})"
exit 1
fi

echo "========== 關閉完成 =========="
exit 0

詳細解析:

  1. 進程二次檢查:

    • 使用-n測試檢查是否仍有存活的Tomcat進程
    • 如果有則進入強制終止流程
  2. 分級終止策略:

    • 先嘗試普通kill命令(SIGTERM信號)
    • 檢查每個進程的所有者(使用ps -o user= -p PID)
    • 對kill失敗的情況立即報錯退出(權限問題)
  3. 強制終止階段:

    • 等待5秒后再次檢查
    • 對仍然存活的進程使用kill -9(SIGKILL信號)
    • 同樣處理權限錯誤情況
  4. 最終狀態確認:

    • 最后一次檢查進程狀態
    • 根據結果輸出成功/失敗信息
    • 返回相應的退出狀態碼(0成功/1失敗)

這個設計體現了完善的進程管理策略:

  • 分級處理(先優雅后強制)
  • 完善的錯誤檢查和權限驗證
  • 明確的進程狀態跟蹤
  • 清晰的執行反饋

代碼中幾個關鍵Shell技巧:

  • 2>/dev/null屏蔽錯誤輸出
  • ps -o user=只輸出用戶名列
  • || echo "unknown"錯誤處理
  • 多級if [ -n/-z ]條件測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915115.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Glary Utilities(系統優化工具) v6.20.0.24 專業便攜版

GlaryUtilities 允許你清理系統垃圾文件&#xff0c;無效的注冊表&#xff0c;上網記錄&#xff0c;刪除插件&#xff0c;查找重復文件&#xff0c;優化內存&#xff0c;修理或刪除快捷方式&#xff0c;管理windows啟動程序&#xff0c;卸載軟件&#xff0c;安全刪除文件&#…

VScode鏈接服務器一直卡在下載vscode服務器/scp上傳服務器,無法連接成功

終極方案&#xff08;強力推薦&#xff0c;親測有效&#xff0c;鏈接只需5秒鐘&#xff09;&#xff1a;本地下載復制到mkdir -p ~/.vscode-server/bin/<commit_hash>里面 <commit_hash>可以從幫助->關于里面找到&#xff0c;如下所示 版本: 1.96.2 提交: fa…

基于Spring Boot的農村農產品銷售系統設計與實現

隨著現代農業的快速發展,傳統農產品的銷售模式逐漸暴露出信息閉塞、流通效率低和中間環節多等問題。為了打破這些瓶頸,我基于Spring Boot框架開發了一套農產品銷售系統,旨在構建一座連接農民與消費者之間的數字橋梁,讓優質農產品更高效地直達用戶餐桌。 一、項目背景與目標…

Mysql默認存儲引擎InnoDB和底層數據結構

在黑馬點評項目實戰中&#xff1a;談到了為什么不推薦使用mysql的字段自增作為訂單id傳遞給客戶端&#xff0c;讓我想到了Mysql的??存儲引擎??和??底層數據結構??究竟是什么&#xff1f;它是如何實現自增的&#xff1f;本文主要是深度解析 MySQL 默認存儲引擎 InnoDB 與…

原點安全簽約金網絡數科,共建一體化數據安全防護體系

金網絡正式攜手原點安全&#xff0c;基于原點安全一體化數據安全平臺&#xff08;uDSP&#xff09;&#xff0c;啟動企業數據安全平臺建設項目&#xff0c;圍繞數據資產盤點、敏感數據識別與分類分級、數據訪問權限管控、數據動態脫敏、數據安全審計與風險監測等關鍵能力建設&a…

mix-blend-mode的了解使用

mix-blend-mode 是 CSS 的一個屬性&#xff0c;用于控制元素的內容&#xff08;如文本、圖像、背景等&#xff09;如何與其 父元素 或 背景 進行混合。它類似于圖形設計軟件&#xff08;如 Photoshop&#xff09;中的圖層混合模式&#xff0c;可以實現各種視覺效果&#xff1b;…

vue自定義指令bug

問題描述&#xff1a;頁面加載時&#xff0c;報已下錯誤。同時&#xff0c;頁面數據不顯示環境介紹&#xff1a;已經添加了vue自定義指令permission&#xff0c;實現如下&#xff0c;用以控制元素顯示權限app.directive(permission, (el, binding) > {if (!store.hasPermiss…

Vue3 + WebSocket

Vue3與WebSocket結合能夠很好地滿足實時通訊的需求。通過合理設計和管理WebSocket連接的生命周期&#xff0c;以及實現必要的重連邏輯和心跳檢測機制&#xff0c;可以構建出響應迅速且穩定的實時應用。WebSocketWebSocket允許服務端主動向客戶端發送數據&#xff0c;無需客戶端…

IPSec和HTTPS對比(一)

IPSec&#xff08;Internet Protocol Security&#xff09;是網絡層&#xff08;OSI第3層&#xff09;的加密協議&#xff0c;其核心機制和與HTTPS的區別如下&#xff1a;&#x1f512; ?一、IPSec的核心機制解析??1. 安全封裝結構?┌──────────┬───────…

關于 c、c#、c++ 三者區別

1. 起源與定位語言起源時間開發者定位/特點C1972年Dennis Ritchie面向過程的編程語言&#xff0c;強調底層控制與高效性能C1983年Bjarne Stroustrup在 C 的基礎上加入 面向對象編程&#xff08;OOP&#xff09;C#2000年微軟&#xff08;Microsoft&#xff09;類似 Java&#xf…

項目總體框架(servlet+axios+Mybatis)

項目總體框架 先暫時這樣子&#xff08;后續發現錯誤的話就改&#xff09; com.hope-tieba/ ← 項目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

RestTemplate 實現后端 HTTP 調用詳解

1. 方法簽名解析方法名和返回類型說明了這個方法的業務意圖和數據結構。Override 表示實現接口方法&#xff0c;利于規范開發和自動檢查。Override public List<RobotInfo> listRobots() {這里 RobotInfo 是假設的業務數據結構&#xff0c;實際項目中按你的類名即可。2. …

Python單例模式詳解:從原理到實戰的完整指南

引言 單例模式是軟件設計中最常用的模式之一&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。在Python中&#xff0c;實現單例模式有多種優雅的方式&#xff0c;本文將詳細講解6種主流實現方法&#xff0c;包含完整代碼示例和注釋。 一、模塊級單例&#x…

拼團系統中的冪等性防護 , 前置性查詢,Redis 庫存預判

這段內容涉及兩個關鍵點&#xff1a;冪等性防護 和 拼團目標量判斷&#xff0c;下面我將分別解釋這兩個問題&#xff0c;并重點說明&#xff1a; “如果沒有攔截&#xff0c;最終訪問數據&#xff0c;也會有數量判斷攔截。” 這句話的意思。 ? 1. 查詢外部交易 outTradeNo 是…

【Python】LEGB作用域 + re模塊 + 正則表達式

文章目錄一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;預覽1. re.match() —— 從字符串開頭匹配2. re.search() —— 搜索整個字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替換匹配的字…

JavaSE -- 數據操作流

6. 數據操作流在執行文件存儲一個對象的時候&#xff0c;如果該對象只有少量屬性需要存儲&#xff0c;并且這些屬性的類型都是基本數據類型&#xff0c;此時則不需要對象序列化技術。使用數據操作流既可以實現。 DataOutputStreamDataInputStream 注意&#xff1a; 讀取數據的時…

GI6E 加密GRID電碼通信SHELLCODE載入

GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

實習十三——傳輸層協議

補充子網劃分的主要目的就是為了節約IP&#xff0c;降低成本&#xff0c;但是如果劃分私有IP網段&#xff0c;則完全沒有意義&#xff0c;因為私有IP可重復&#xff0c;不要錢&#xff0c;所以私有IP嚴禁進行子網掩碼劃分傳輸層協議TCP三次握手TCP協議數據格式第一次握手&#…

RPG59.玩家拾取物品三:可拾取物品的提示UI

1。以WarriorWidgetBase作為父類&#xff0c;創建一個子類的userwidget2.布局為兩個值都為1203。然后我們需要想辦法&#xff0c;在合適的位置&#xff0c;用bool來控制此控件的顯示與隱藏。情況為&#xff1a;當玩家觸發與可拾取物體的重疊時&#xff0c;我們將廣播一個bool值…

Vue.js 國際化 (i18n) 實踐:讓你的應用走向全球,多語言支持如此簡單!

文章目錄一、為何你的 Vue.js 應用需要“說多種語言”&#xff1f;國際化的重要性二、Vue I18n 基礎實踐&#xff1a;從零開始搭建多語言環境2.1 安裝 Vue I18n2.2 配置 Vue I18n 實例2.3 在組件中使用翻譯三、進階實踐&#xff1a;讓國際化更強大、更靈活3.1 動態語言切換3.2 …