शेल स्क्रिप्ट से जेएमएक्स एमबीएन विधि को कॉल करना


98

क्या कोई लाइब्रेरी है जो मुझे शेल स्क्रिप्ट से JMX MBean पद्धति को कॉल करने की अनुमति देगी। हम JMX के माध्यम से कुछ संचालन / व्यवस्थापक आदेशों को उजागर करते हैं, और हम अपने व्यवस्थापक JConsole, या VisualVM का उपयोग कर सकते हैं, लेकिन कुछ कार्य स्वचालन के लिए बेहतर हैं। उस स्वचालन में हम अपने चल रहे सर्वर पर JMX MBean विधि को कॉल करने में सक्षम होना चाहते हैं, अधिमानतः एक शेल स्क्रिप्ट से।

जवाबों:


106

निम्नलिखित कमांड लाइन JMX उपयोगिताओं उपलब्ध हैं:

  1. jmxterm - सबसे पूर्ण रूप से चित्रित उपयोगिता प्रतीत होती है।
  2. cmdline-jmxclient - WebArchive प्रोजेक्ट में उपयोग की जाने वाली हड्डियाँ बहुत नंगी लगती हैं (और 2006 के बाद से कोई विकास नहीं दिखता)
  3. ग्रूवी स्क्रिप्ट और जेएमएक्स - कुछ वास्तव में शक्तिशाली जेएमएक्स कार्यक्षमता प्रदान करता है, लेकिन ग्रूवी और अन्य लाइब्रेरी सेटअप की आवश्यकता होती है।
  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 ()

फिर आप एक साधारण बैश स्क्रिप्ट लिख सकते हैं (यह मानते हुए कि आप 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


19

मैंने jmxfuse विकसित किया है जो JMX Mbeans को Linux FUSE फाइल सिस्टम के रूप में समान कार्यक्षमता के साथ / proc fs के रूप में उजागर करता है। यह 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

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

यह महान है, और बहुत तेज है। Jmxterm के लिए 3 सेकंड बनाम मान वापस करने के लिए 0.3 सेकंड के बारे में
सिवन

9

संभवतः जावा में यह लिखना सबसे आसान है

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 के लिए संकलित होगा और सर्वर या किसी भी जटिल मावेन पैकेजिंग में निर्भरता की आवश्यकता नहीं है।

इसके साथ बुलाओ

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

4

थोड़ा जोखिम भरा है, लेकिन आप JMX कंसोल, इसके URL और http प्रमाणीकरण (यदि आवश्यक हो) से फॉर्म के मानों के साथ कर्ल 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>

मैंने इसे जावा से ए का उपयोग करके इसे लागू किया है HttpURLConnectionऔर मैं पुष्टि कर सकता हूं कि यह काम करता है। (btw। submit=Invokeअनावश्यक है)
टॉम

क्या यह वर्णन करना संभव है कि यह कैसे काम करता है? मेरा मतलब है, डिफ़ॉल्ट रूप से जेएमएक्स का उपयोग करता है rmi, और वहां मैं देखता हूं http। क्या इसका मतलब है कि सर्वर को जेएमएक्स अनुरोधों का समर्थन करने के लिए कॉन्फ़िगर किया जाना है http?
साइकोजोइक

3

JManage पर एक नज़र डालें । यह MBean विधियों को निष्पादित करने और कमांड लाइन से विशेषताएँ प्राप्त / सेट करने में सक्षम है ।


केवल नकारात्मक पक्ष यह है कि कमांड लाइन उपयोगिता का उपयोग करने के लिए यह आवश्यक है कि JManage आपके JMX सर्वर पर प्रॉक्सी कमांड के लिए चल रहा हो। मैं सीधे JMX सर्वर पर सीधे अधिक हल्के वजन वाला दृष्टिकोण चाहता हूं।
डगुनुकेम

3

तुम भी jmx4perl पर एक नज़र रखना चाहते हो सकता है । यह जावा-ईई सर्वर के दूरस्थ जावा तक कम पहुंच प्रदान करता है। हालांकि, एक छोटे एजेंट सर्वलेट को लक्ष्य प्लेटफ़ॉर्म पर स्थापित करने की आवश्यकता होती है, जो एक JSON लोड के साथ HTTP के माध्यम से एक आरामदायक JMX एक्सेस प्रदान करता है। (संस्करण ०.५० एक जेएसआर -१६० प्रॉक्सी को लागू करके एक एजेंट रहित मोड जोड़ देगा)।

स्थानीय जावा JVM लॉन्च करने और उपयोग में आसानी की तुलना में फायदे त्वरित स्टार्टअप समय हैं। jmx4perl पर्ल मॉड्यूल के एक पूर्ण सेट के साथ आता है जिसे आसानी से अपनी स्क्रिप्ट में उपयोग किया जा सकता है:

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 / विशेषता / ऑपरेशन कॉम्बोस (उदाहरण के लिए अधिकांश MXBeans) के लिए भी अन्य का उपयोग कर सकते हैं। अतिरिक्त सुविधाओं के लिए (Nagios-Plugin, XPath- जैसी जटिल विशेषता प्रकारों तक पहुंच, ...), कृपया jmx4perl के प्रलेखन को देखें।


1

@Dougnukem उत्तर ने मुझे बहुत मदद की। मैंने ग्रूवी दृष्टिकोण (groovy 2.3.3 का उपयोग करके) लिया है।

मैंने डगुनुकेम कोड पर कुछ बदलाव किए। यह जावा 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)
                    }

                }
            }

मावेन-कंपाइलर-प्लगइन का उपयोग करके इस कोड को एक जार में संकलित करें ताकि आपको केवल 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>

इसे बल्ले या खोल के साथ लपेटें और यह डेटा को प्रिंट करने के लिए प्रिंट करेगा।


0

मैं बैश जैसे माहौल के बारे में निश्चित नहीं हूं। आप जावा में कुछ सरल आवरण प्रोग्राम (प्रोग्राम तर्क के साथ) की कोशिश कर सकते हैं जो दूरस्थ सर्वर पर आपके एमबीन्स को आमंत्रित करते हैं। फिर आप इन रैपर को शेल स्क्रिप्ट से कॉल कर सकते हैं

यदि आप पायथन या पर्ल जैसी किसी चीज़ का उपयोग कर सकते हैं, तो आपको JSR-262 में रुचि हो सकती है जो आपको वेब सेवाओं पर JMX संचालन को उजागर करने की अनुमति देता है। यह जावा 7 में शामिल होने के लिए निर्धारित है, लेकिन आप संदर्भ कार्यान्वयन के रिलीज उम्मीदवार का उपयोग करने में सक्षम हो सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.