请求提供Linux下Multi-instance队列管理器与Broker优雅启停/切换脚本
IBM MQ Multi-Instance 队列管理器与Broker优雅启停/切换脚本
一、前置准备说明
- 所有操作需以
mqm用户身份执行 - 已完成队列管理器多实例的共享存储、心跳检测等基础配置
- Broker已关联目标多实例队列管理器,且节点间Broker配置文件路径统一
二、Broker优雅停止脚本(mq_broker_stop.sh)
#!/bin/bash # 优雅停止指定Broker,优先处理完现有消息再终止进程 BROKER_NAME=$1 # 检查Broker运行状态 mqsistatus $BROKER_NAME > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Broker $BROKER_NAME 未处于运行状态" exit 0 fi # 触发优雅关闭:拒绝新请求,等待现有消息处理完成 mqshutdown -i $BROKER_NAME # 等待进程终止,最多等待300秒(可根据业务调整) WAIT_TIME=0 MAX_WAIT=300 while true; do mqsistatus $BROKER_NAME > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Broker $BROKER_NAME 已成功停止" break fi if [ $WAIT_TIME -ge $MAX_WAIT ]; then echo "等待超时,强制终止Broker $BROKER_NAME 进程" mqsistop -f $BROKER_NAME break fi sleep 5 WAIT_TIME=$((WAIT_TIME+5)) done
三、Multi-Instance队列管理器优雅停止/切换脚本(mq_mi_qmgr_stop.sh)
#!/bin/bash # 优雅停止多实例队列管理器,优先触发主动切换至备用节点 QMGR_NAME=$1 # 检查队列管理器运行状态 dspmq -m $QMGR_NAME | grep -q "RUNNING" if [ $? -ne 0 ]; then echo "队列管理器 $QMGR_NAME 未处于运行状态" exit 0 fi # 尝试主动切换到备用节点(仅当备用节点可用时生效) echo "尝试触发队列管理器 $QMGR_NAME 主动切换至备用节点..." endmqm -s $QMGR_NAME # 检查切换结果,若当前节点仍为活动节点则执行本地优雅停止 dspmq -m $QMGR_NAME | grep -q "RUNNING" if [ $? -eq 0 ]; then echo "主动切换失败,执行本地优雅停止..." endmqm -i $QMGR_NAME fi # 等待队列管理器完全终止 WAIT_TIME=0 MAX_WAIT=120 while true; do dspmq -m $QMGR_NAME | grep -q "ENDED" if [ $? -eq 0 ]; then echo "队列管理器 $QMGR_NAME 已成功停止" break fi if [ $WAIT_TIME -ge $MAX_WAIT ]; then echo "等待超时,强制终止队列管理器 $QMGR_NAME" endmqm -f $QMGR_NAME break fi sleep 5 WAIT_TIME=$((WAIT_TIME+5)) done
四、队列管理器+Broker联合切换脚本(mq_mi_full_switch.sh)
#!/bin/bash # 完成多实例队列管理器与Broker的跨节点切换,先停Broker再处理队列管理器 QMGR_NAME=$1 BROKER_NAME=$2 TARGET_NODE=$3 # 备用节点的主机名或IP地址 # 1. 停止当前节点的Broker echo "=== 停止当前节点Broker $BROKER_NAME ===" ./mq_broker_stop.sh $BROKER_NAME # 2. 停止/切换当前节点的队列管理器 echo "=== 处理队列管理器 $QMGR_NAME 切换 ===" ./mq_mi_qmgr_stop.sh $QMGR_NAME # 3. 在目标节点启动队列管理器(需提前配置mqm用户跨节点免密登录) echo "=== 在目标节点 $TARGET_NODE 启动队列管理器 $QMGR_NAME ===" ssh mqm@$TARGET_NODE "strmqm $QMGR_NAME" # 4. 在目标节点启动Broker echo "=== 在目标节点 $TARGET_NODE 启动Broker $BROKER_NAME ===" ssh mqm@$TARGET_NODE "mqsistart $BROKER_NAME" echo "=== 队列管理器与Broker切换操作完成 ==="
五、脚本使用说明
- 给所有脚本添加执行权限:
chmod +x *.sh - 单独停止Broker:
./mq_broker_stop.sh <Broker名称> - 单独停止/切换队列管理器:
./mq_mi_qmgr_stop.sh <队列管理器名称> - 执行跨节点联合切换:
./mq_mi_full_switch.sh <队列管理器名称> <Broker名称> <目标节点> - 若需整合为系统服务,可将脚本封装进systemd单元,确保以
mqm用户身份执行
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

