쉘 스크립트에서 JMX MBean 메소드 호출


98

쉘 스크립트에서 JMX MBean 메소드를 호출 할 수있는 라이브러리가 있습니까? JMX를 통해 일부 작업 / 관리 명령을 공개하고 관리자가 JConsole 또는 VisualVM을 사용하도록 할 수 있지만 일부 작업은 자동화에 맡기는 것이 좋습니다. 이 자동화에서 우리는 실행중인 서버, 가급적이면 쉘 스크립트에서 JMX MBean 메서드를 호출 할 수 있기를 원합니다.

답변:


106

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

  1. jmxterm- 가장 완전한 기능을 갖춘 유틸리티 인 것 같습니다.
  2. cmdline-jmxclient- WebArchive 프로젝트에서 사용되는 것은 매우 엉성한 것 같습니다 (2006 년 이후로 개발되지 않은 것 같습니다).
  3. Groovy 스크립트 및 JMX- 매우 강력한 JMX 기능을 제공하지만 그루비 및 기타 라이브러리 설정이 필요합니다.
  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=datasystem,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

jmxterm이 Java 7에서 작동하지 않는 것 같습니다. bugs.launchpad.net/jmxterm/+bug/942693
artbristol

19

나는 JMX Mbean을 / proc fs와 유사한 기능을 가진 Linux FUSE 파일 시스템으로 노출하는 jmxfuse를 개발했습니다. JMX의 다리로 Jolokia에 의존합니다 . 읽기 및 쓰기를 위해 속성 및 작업이 노출됩니다.

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

예를 들어, 속성을 읽으려면 :

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

12

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;;;;

이것은 훌륭하고 매우 빠릅니다. 값을 반환하는 데 약 0.3 초 ​​대 jmxterm의 경우 3 초
sivann

9

잠재적으로 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]

4

약간 위험하지만 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>

나는 a를 사용하여 Java에서 이런 방식으로 구현 HttpURLConnection했으며 작동하는지 확인할 수 있습니다. (btw. submit=Invoke불필요)
tom

어떻게 작동하는지 설명 할 수 있습니까? 내 말은, 기본적으로 jmx는를 사용 rmi하고 거기에 http. 서버가 jmx 요청을 지원하도록 구성되어야 함을 의미합니까 http?
Psychozoic

3

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


유일한 단점은 명령 줄 유틸리티를 사용하는 것입니다. JMX 서버에 명령을 프록시하려면 JManage를 실행해야합니다. 오히려 JMX 서버 자체에 대한보다 가벼운 접근 방식을 선호합니다.
Dougnukem

3

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 / 속성 / 연산 콤보 (예 : 대부분의 MXBean)에 별칭을 사용할 수도 있습니다. 추가 기능 (Nagios-Plugin, 복잡한 속성 유형에 대한 XPath와 유사한 액세스, ...)에 대해서는 jmx4perl의 문서를 참조하십시오.


1

@Dougnukem 대답은 나를 많이 도왔습니다. 나는 Groovy 접근 방식을 취했습니다 (groovy 2.3.3 사용).

Dougnukem 코드를 약간 변경했습니다. 이것은 Java 7에서 작동하며 10 초마다 두 개의 속성을 stdout에 인쇄합니다.

        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에 인쇄됩니다.


0

bash와 같은 환경에 대해 잘 모르겠습니다. 원격 서버에서 MBean을 호출하는 Java (프로그램 인수 포함)의 간단한 래퍼 프로그램을 시도해 볼 수 있습니다. 그런 다음 쉘 스크립트에서 이러한 래퍼를 호출 할 수 있습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.