programing

셸 스크립트로부터의 JMX MBean 메서드 호출

newsource 2022. 11. 16. 21:17

셸 스크립트로부터의 JMX MBean 메서드 호출

셸 스크립트에서 JMX MBean 메서드를 호출할 수 있는 라이브러리가 있습니까?JMX를 통해 일부 Operations/admin 명령을 노출하고 관리자가 JConsole(Visual VM)을 사용하도록 할 수 있지만 일부 작업은 자동화에 맡기는 것이 좋습니다.이 자동화에서는 실행 중인 서버에서 JMX MBean 메서드를 호출할 수 있습니다(가능하면 셸 스크립트에서).

다음 명령줄 JMX 유틸리티를 사용할 수 있습니다.

  1. jmxterm - 가장 완전한 기능을 갖춘 유틸리티인 것 같습니다.
  2. cmdline-jmxclient - WebArchive 프로젝트에서 사용되는 것은 매우 베어본처럼 보입니다(그리고 2006년 이후 개발은 없습니다).
  3. Groovy 스크립트JMX - 매우 강력한 JMX 기능을 제공하지만 Groovy 및 기타 라이브러리 셋업이 필요합니다.
  4. JManage 명령줄 기능 - (단, 실행 중인 JManage 서버가 명령을 프록시할 필요가 있습니다.)

Groovy JMX의 예:

import java.lang.management.*
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXServiceURL as JmxUrl

def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9003/jmxrmi'
String beanName = "com.webwars.gameplatform.data:type=udmdataloadsystem,id=0"
def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection
def dataSystem = new GroovyMBean(server, beanName)

println "Connected to:\n$dataSystem\n"

println "Executing jmxForceRefresh()"
dataSystem.jmxForceRefresh();

cmdline-jmxclient의 예:

를 가지고 있는 경우

  • MBean: com.company.data:type=데이터시스템,id=0

호출된 작업:

  • jmxForceRefresh()

그런 다음 간단한 bash 스크립트를 작성할 수 있습니다(cmdline-jmxclient-0.10.3.jar를 다운로드하여 스크립트와 동일한 디렉토리에 저장한다고 가정합니다).

#!/bin/bash

cmdLineJMXJar=./cmdline-jmxclient-0.10.3.jar
user=yourUser
password=yourPassword
jmxHost=localhost
port=9003

#No User and password so pass '-'
echo "Available Operations for com.company.data:type=datasystem,id=0"
java -jar ${cmdLineJMXJar} ${user}:${password} ${jmxHost}:${port} com.company.data:type=datasystem,id=0

echo "Executing XML update..."
java -jar ${cmdLineJMXJar} - ${jmxHost}:${port} com.company.data:type=datasystem,id=0 jmxForceRefresh

JMX Mbeans를 /proc fs와 유사한 기능을 가진 Linux FUSE 파일 시스템으로 공개하는 jmxfuse를 개발했습니다.JMX로의 브리지로서 Jolokia에 의존하고 있습니다.속성과 조작은 읽기와 쓰기에 노출되어 있습니다.

http://code.google.com/p/jmxfuse/

예를 들어 Atribute를 읽으려면:

me@oddjob:jmx$ cd log4j/root/attributes
me@oddjob:jmx$ cat priority

속성을 작성하려면:

me@oddjob:jmx$ echo "WARN" > priority

작업을 호출하려면:

me@oddjob:jmx$ cd Catalina/none/none/WebModule/localhost/helloworld/operations/addParameter
me@oddjob:jmx$ echo "myParam myValue" > invoke

Syabru Nagios JMX 플러그인은 Nagios에서 사용하는 것을 의도하고 있지만 Nagios가 필요하지 않고 명령줄 사용에 매우 편리합니다.

~$ ./check_jmx -U service:jmx:rmi:///jndi/rmi://localhost:1099/JMXConnector --username myuser --password mypass -O java.lang:type=Memory -A HeapMemoryUsage -K used 
JMX OK - HeapMemoryUsage.used = 445012360 | 'HeapMemoryUsage used'=445012360;;;;

Java에서 쓰는 것이 가장 쉬울 수 있습니다.

import javax.management.*;
import javax.management.remote.*;

public class JmxInvoke {

    public static void main(String... args) throws Exception {
        JMXConnectorFactory.connect(new JMXServiceURL(args[0]))
            .getMBeanServerConnection().invoke(new ObjectName(args[1]), args[2], new Object[]{}, new String[]{});    
    }

}

이는 단일 .class로 컴파일되며 서버나 복잡한 maven 패키징에 의존할 필요가 없습니다.

와 함께 그것을 부르다

javac JmxInvoke.java
java -cp . JmxInvoke [url] [beanName] [method]

조금 위험하지만 JMX 콘솔의 폼 값, URL 및 http 인증(필요한 경우)을 사용하여 curl POST 명령을 실행할 수 있습니다.

curl -s -X POST --user 'myuser:mypass'
  --data "action=invokeOp&name=App:service=ThisServiceOp&methodIndex=3&arg0=value1&arg1=value1&submit=Invoke"
  http://yourhost.domain.com/jmx-console/HtmlAdaptor

주의: 소프트웨어 변경에 따라 메서드 인덱스가 변경될 수 있습니다.또한 웹 양식의 구현도 변경될 수 있습니다.

위의 내용은 실행하는 조작의 JMX 서비스 페이지 소스를 기반으로 합니다.

http://yourhost.domain.com/jmx-console/HtmlAdaptor?action=inspectMBean&name=YourJMXServiceName

폼 소스:

form method="post" action="HtmlAdaptor">
   <input type="hidden" name="action" value="invokeOp">
   <input type="hidden" name="name" value="App:service=ThisServiceOp">
   <input type="hidden" name="methodIndex" value="3">
   <hr align='left' width='80'>
   <h4>void ThisOperation()</h4>
   <p>Operation exposed for management</p>
    <table cellspacing="2" cellpadding="2" border="1">
        <tr class="OperationHeader">
            <th>Param</th>
            <th>ParamType</th>
            <th>ParamValue</th>
            <th>ParamDescription</th>
        </tr>
        <tr>
            <td>p1</td>
           <td>java.lang.String</td>
         <td> 
            <input type="text" name="arg0">
         </td>
         <td>(no description)</td>
        </tr>
        <tr>
            <td>p2</td>
           <td>arg1Type</td>
         <td> 
            <input type="text" name="arg1">
         </td>
         <td>(no description)</td>
        </tr>
    </table>
    <input type="submit" value="Invoke">
</form>

jmx4perl도 확인해 보세요.원격 Java EE 서버의 MBean에 대한 Java 없는 액세스를 제공합니다.단, 타겟플랫폼에 스몰에이전트 서블릿을 설치해야 합니다.이것에 의해, JSON 페이로드로 HTTP 경유로 안정된 JMX 액세스를 실현할 수 있습니다.(버전 0.50에서는 JSR-160 프록시를 구현하여 에이전트리스 모드가 추가됩니다).

장점은 로컬 Java JVM을 실행하는 것에 비해 빠른 시작 시간과 사용하기 쉽다는 것입니다.jmx4perl에는 자체 스크립트에서 쉽게 사용할 수 있는 풀 세트의 Perl 모듈이 포함되어 있습니다.

use JMX::Jmx4Perl;
use JMX::Jmx4Perl::Alias;   # Import certains aliases for MBeans

print "Memory Used: ",
      JMX::Jmx4Perl
          ->new(url => "http://localhost:8080/j4p")
          ->get_attribute(MEMORY_HEAP_USED);

또, 일반적인 MBean/Attribute/Operation 콤보(대부분의 MXBean 등)에도 에일리어스를 사용할 수 있습니다.추가 기능(Nagios-Plugin, 복잡한 속성 유형에 대한 XPath 액세스 등)에 대해서는 jmx4perl 문서를 참조하십시오.

JManage를 보세요.MBean 메서드를 실행하고 명령줄에서 속성을 가져오거나 설정할 수 있습니다.

@dougnumm의 답변이 큰 도움이 되었다.Groovy 어프로치를 취하고 있습니다(Groovy 2.3.3을 사용).

Dognumkem 코드에 변경을 가했습니다.이것은 Java 7에서 동작하며 10초마다 stdout에 2개의 속성을 출력합니다.

        package com.my.company.jmx
        import groovy.util.GroovyMBean;
        import javax.management.remote.JMXServiceURL
        import javax.management.remote.JMXConnectorFactory
        import java.lang.management.*

            class Monitor {
                static main(args) {
                    def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:5019/jmxrmi'
                    String beanName = "Catalina:type=DataSource,class=javax.sql.DataSource,name=\"jdbc/CommonDB\""
                    println  "numIdle,numActive"

                    while(1){
                        def server = JMXConnectorFactory.connect(new JMXServiceURL(serverUrl))
                       //make sure to reconnect in case the jvm was restrated 
                        server.connect()
                        GroovyMBean mbean = new GroovyMBean(server.MBeanServerConnection, beanName)
                        println  "${mbean.numIdle},${mbean.numActive}"
                        server.close()
                        sleep(10000)
                    }

                }
            }

maven-compiler-plugin을 사용하여 이 코드를 jar로 컴파일하여 groovy-all.jar만 설치할 필요가 없도록 합니다.다음은 관련된 플러그인 정의와 의존관계를 나타냅니다.

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerId>groovy-eclipse-compiler</compilerId>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-compiler</artifactId>
                        <version>2.8.0-01</version>
                    </dependency>
                    <dependency>
                        <groupId>org.codehaus.groovy</groupId>
                        <artifactId>groovy-eclipse-batch</artifactId>
                        <version>2.3.4-01</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>

배트나 셸로 감싸면 데이터가 stdout에 인쇄됩니다.

배쉬 같은 환경은 잘 모르겠어요.원격 서버에서 MBeans를 호출하는 Java의 간단한 래퍼 프로그램(프로그램 인수 포함)을 사용해 볼 수 있습니다.그런 다음 셸 스크립트에서 이러한 래퍼를 호출할 수 있습니다.

Python이나 Perl과 같은 것을 사용할 수 있다면 웹 서비스를 통해 JMX 작업을 노출할 수 있는 JSR-262에 관심이 있을 수 있습니다.이는 Java 7에 포함될 예정이지만 레퍼런스 구현의 릴리스 후보를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1751130/calling-jmx-mbean-method-from-a-shell-script