Запустите jboss-cli только один раз

Я хочу создать сценарий bash/shell, который отслеживает использование памяти JVM Wildfly с помощью jboss-cli. Для этого мне нужно получить хосты и получить серверы Wildfly для каждого хоста в цикле for. Однако запуск/подключение jboss-cli занимает несколько секунд и нагружает ЦП. Это делает скрипт очень медленным. Отправка команд в интерактивном сеансе 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
        }       
}

person b100    schedule 18.06.2020    source источник
comment
В дополнение к начальному сообщению: есть 3 хоста, на каждом из которых 50 серверов Wildfly, так что в настоящее время это означает +/- 300 раз, создающих соединение jboss-cli на данный момент.   -  person b100    schedule 18.06.2020


Ответы (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
person Andre Gelinas    schedule 18.06.2020