从shell脚本调用JMX MBean方法

是否有任何库允许我从shell脚本调用JMX MBean方法。 我们通过JMX公开一些操作/pipe理命令,我们可以让我们的pipe理员使用JConsole或VisualVM,但是有些任务最好留给自动化。 在这种自动化中,我们希望能够在运行的服务器上调用JMX MBean方法,最好是从shell脚本中调用。

以下命令行JMX实用程序可用:

  1. jmxterm – 似乎是最全function的工具。
  2. cmdline-jmxclient – 在WebArchive项目中使用似乎是非常裸露的骨头(自2006年以来没有发展,它看起来像)
  3. Groovy脚本和JMX – 提供了一些非常强大的JMXfunction,但需要groovy和其他库设置。
  4. JManage命令行function – (缺点是它需要运行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 import groovy.swing.SwingBuilder import javax.swing.WindowConstants as WC 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 

我开发了jmxfuse,它将JMX Mbeans公开为一个Linux FUSE文件系统,其function类似于/ proc fs。 它依靠Jolokia作为JMX的桥梁。 属性和操作暴露给阅读和写作。

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

看看JManage 。 它能够执行MBean方法并从命令行获取/设置属性。

有点冒险,但是你可以使用JMX控制台的表单中的值,URL和httpauthentication(如果需要)运行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 

forms来源:

 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远程Java EE服务器的MBean的无权限访问。 但是,需要在目标平台上安装一个小型代理程序servlet,该平台通过HTTP提供JSON有效负载来提供一个稳定的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)。 有关其他function(Nagios插件,类似于XPath的访问复杂属性types…),请参阅jmx4perl的文档。

@Dougnukem的回答帮了我很多。 我采取了Groovy的方法(起诉groovy 2.3.3)

我在Dougnukem代码上做了一些修改。 这将与Java 7的工作,并将打印两个属性标准输出10秒。

  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安装,只需要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> 

用蝙蝠或shell包装它,它将打印数据到标准输出。

我不确定bash式的环境。 您可以尝试一些简单的Java包装程序(带程序参数)来调用远程服务器上的MBean。 然后你可以从shell脚本中调用这些包装器

如果您可以使用Python或Perl之类的东西,您可能会对JSR-262感兴趣,它允许您通过Web服务公开JMX操作。 这个计划将被包含在Java 7中,但你可能能够使用参考实现的候选版本