如何编写runmqsc MQ命令查询curdepth超过maxdepth 80%的队列
IBM MQ查询队列深度超过最大深度80%的runmqsc实现方案
注意:runmqsc原生WHERE过滤条件不支持两个属性间的算术比较运算,无法通过单条DISPLAY命令直接实现过滤,需要结合系统工具做二次处理。
Linux/Unix环境通用实现(兼容所有MQ版本)
直接运行如下命令,将YOUR_QMGR_NAME替换为实际的队列管理器名称即可:
runmqsc YOUR_QMGR_NAME << EOF | awk '/QUEUE\(/ {q=$0; gsub(/.*QUEUE\(|\).*/,"",q)} /CURDEPTH\(/ {c=$0; gsub(/.*CURDEPTH\(|\).*/,"",c)} /MAXDEPTH\(/ {m=$0; gsub(/.*MAXDEPTH\(|\).*/,"",m); if(m>0 && c/m > 0.8) print "队列:"q " 当前深度:"c " 最大深度:"m " 使用率:"int(c/m*100)"%"}' DISPLAY QLOCAL(*) CURDEPTH MAXDEPTH EOF
逻辑说明:先批量查询所有本地队列的当前深度、最大深度属性,通过awk提取对应字段,自动跳过最大深度为0的队列避免除零报错,最终输出使用率超过80%的队列信息。
MQ 9.2.0及以上版本简化实现(Linux/Unix环境)
高版本MQ支持JSON格式输出,可通过jq工具简化字段解析,命令稳定性更高:
runmqsc -f JSON YOUR_QMGR_NAME "DISPLAY QLOCAL(*) CURDEPTH MAXDEPTH" | jq -r '.parameters[] | select(.CURDEPTH / .MAXDEPTH > 0.8 and .MAXDEPTH > 0) | "队列:\(.QUEUE) 当前深度:\(.CURDEPTH) 最大深度:\(.MAXDEPTH) 使用率:\((.CURDEPTH/.MAXDEPTH*100|floor))%"'
Windows环境实现(Powershell)
将如下代码保存为.ps1脚本执行,替换YOUR_QMGR_NAME为实际队列管理器名称:
$output = runmqsc YOUR_QMGR_NAME "DISPLAY QLOCAL(*) CURDEPTH MAXDEPTH" $queue = $null $curdepth = $null foreach ($line in $output) { if ($line -match 'QUEUE\((.*?)\)') { $queue = $matches[1] } if ($line -match 'CURDEPTH\((\d+)\)') { $curdepth = [int]$matches[1] } if ($line -match 'MAXDEPTH\((\d+)\)') { $maxdepth = [int]$matches[1] if ($maxdepth -gt 0 -and $curdepth / $maxdepth -gt 0.8) { Write-Host "队列:$queue 当前深度:$curdepth 最大深度:$maxdepth 使用率:$([math]::Round($curdepth/$maxdepth*100))%" } } }
内容的提问来源于stack exchange,提问作者Afroz Md
相关产品推荐
相关产品推荐

