셸 스크립트로부터의 JMX MBean 메서드 호출
셸 스크립트에서 JMX MBean 메서드를 호출할 수 있는 라이브러리가 있습니까?JMX를 통해 일부 Operations/admin 명령을 노출하고 관리자가 JConsole(Visual VM)을 사용하도록 할 수 있지만 일부 작업은 자동화에 맡기는 것이 좋습니다.이 자동화에서는 실행 중인 서버에서 JMX MBean 메서드를 호출할 수 있습니다(가능하면 셸 스크립트에서).
다음 명령줄 JMX 유틸리티를 사용할 수 있습니다.
- jmxterm - 가장 완전한 기능을 갖춘 유틸리티인 것 같습니다.
- cmdline-jmxclient - WebArchive 프로젝트에서 사용되는 것은 매우 베어본처럼 보입니다(그리고 2006년 이후 개발은 없습니다).
- Groovy 스크립트 및 JMX - 매우 강력한 JMX 기능을 제공하지만 Groovy 및 기타 라이브러리 셋업이 필요합니다.
- 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
'programing' 카테고리의 다른 글
명령줄 인수를 해석하는 가장 좋은 방법은 무엇입니까? (0) | 2022.11.16 |
---|---|
가져오기되지 않은 지연 개체에서 잭슨 직렬화 방지 (0) | 2022.11.16 |
mariadb IF 스테이트먼트 오류 메시지? (0) | 2022.11.16 |
중괄호가 있는 어레이 및 문자열 오프셋 액세스 구문은 권장되지 않습니다. (0) | 2022.11.16 |
스프링과 DB의 연결이 끊겨 복구 또는 재연결되지 않음 (0) | 2022.11.16 |