只启动一次 jboss-cli

Posted

技术标签:

【中文标题】只启动一次 jboss-cli【英文标题】:Start jboss-cli only once 【发布时间】:2020-10-08 12:05:24 【问题描述】:

我想创建一个 bash/shell 脚本,使用 jboss-cli 监控 Wildfly 的 JVM 内存使用情况 因此,我需要在 for 循环中获取主机并获取每个主机的 Wildfly 服务器。然而,启动/连接 jboss-cli 需要几秒钟的时间并且会给 CPU 带来压力。这使得脚本非常慢。在交互式 jboss-cli 会话中发送命令非常快。

有没有办法只连接一次 jboss-cli 并将输入命令发送到该活动会话?我需要命令的输出才能继续执行脚本。

当前脚本:

# List all hosts:
hosts="$(jboss-cli.sh -c --controller=servername:9990 --command=":read-children-names(child-type=host)" | grep "        " | awk 'print $1' | sed 's/,//g' | sed 's/"//g')"
# Loop through hosts results:
for host in $hosts
       
        #List all servers:
        servers="$(jboss-cli.sh -c --controller=servername:9990 --command="/host=$host:read-children-names(child-type=server)" | grep "        " | awk 'print $1' | sed 's/,//g' | sed 's/"//g')"
        # Loop through server results:
        for server in $servers
        
            # check if server is running:
            serverstate=$(jboss-cli.sh -c --controller=servername:9990 --command="/host=$host/server=$server:read-attribute(name=server-state)" | grep "result" | awk 'print $3' | sed 's/"//g')

            if [ $serverstate = "running" ]
            then
                #Do a check etc. etc.
            fi
               

【问题讨论】:

除了开始的帖子:有 3 台主机,每台 50 台 Wildfly 服务器,因此目前意味着 +/- 300 次创建 jboss-cli 连接。 【参考方案1】:

遇到了类似的问题。我的解决方案是在 ksh 中使用协程,我不知道它是否可以像你的标志一样在 bash 中使用(但如果安装了 ksh,你仍然可以使用它)。至少它可能会给你一些指示。

#!/bin/ksh

#connecting using coroutine -- Note the |& at the end
JBOSS_HOME/bin/jboss-cli.sh --connect --controller=Master_IP:Master_Port --user=UID --password=Password |&
#sending request to coroutine
print -p "ls -l /host\n"
#Reading from corouting
while read -p answer; do
##Need to verify when stop reading -- after the prompt is back
    if [[ $answer != *domain*:* ]]; then
    ## If it's not an error, concatenate, space delimited, the response
        if [[ $answer == *WFLYCTL* ]]; then
            print "$(date +"%Y%m%d%H%M") - FATAL - Error detected - Exiting"
            print "$(date +"%Y%m%d%H%M") - Error detected : $answer"
            exit
        else
            Dummy+=$answer" "
        fi
    elif [[ locFlag -eq 1 ]]; then
        locFlag=0
        break
    else
        locFlag=1
    fi
done
##Response to array
SvrArray=( $Dummy )
##Do anything with the response, here just printing
for i in $!SvrArray[@]; do
        print "$i. $SvrArray[$i]"
done

【讨论】:

以上是关于只启动一次 jboss-cli的主要内容,如果未能解决你的问题,请参考以下文章

android 线程只启动一次

第一次启动应用程序时如何只访问一次任何方法

如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?

如何像启动画面一样只运行一次活动

让 `didFailLoadWithError:` 在启动时只运行一次

spring quartz配置每分钟执行一次,为啥启动项目只执行一次?