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

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



답변

다음 명령 줄 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


답변

나는 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


답변

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>


답변

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


답변

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의 문서를 참조하십시오.