শেল স্ক্রিপ্ট থেকে জেএমএক্স এমবিয়ান পদ্ধতি কল করা


98

এমন কোনও লাইব্রেরি রয়েছে যা আমাকে শেল স্ক্রিপ্ট থেকে জেএমএক্স এমবিয়ান পদ্ধতিতে কল করতে দেয়। আমরা জেএমএক্সের মাধ্যমে কিছু অপারেশন / অ্যাডমিন কমান্ড প্রকাশ করি এবং আমাদের প্রশাসকরা জে কনসোল বা ভিজুয়ালভিএম ব্যবহার করতে পারি তবে কিছু কাজ অটোমেশনের থেকে আরও ভাল থাকে। সেই অটোমেশনে আমরা আমাদের চলমান সার্ভারে জেএমএক্স এমবিয়ান পদ্ধতিটি কল করতে সক্ষম হতে চাই, বিশেষত শেল স্ক্রিপ্ট থেকে।

উত্তর:


106

নিম্নলিখিত কমান্ড লাইন জেএমএক্স ইউটিলিটিগুলি উপলভ্য:

  1. jmxterm - মনে হয় এটি সম্পূর্ণরূপে বৈশিষ্ট্যযুক্ত ইউটিলিটি।
  2. cmdline-jmxclient - ওয়েবআর্কাইভ প্রকল্পে ব্যবহৃত হ'ল মনে হয় খুব খালি হাড় (এবং ২০০ 2006 সালের পরে এরকম বিকাশ যেমনটি দেখায় না)
  3. গ্রোভি স্ক্রিপ্ট এবং জেএমএক্স - কিছু সত্যই শক্তিশালী জেএমএক্স কার্যকারিতা সরবরাহ করে তবে গ্রোভি এবং অন্যান্য লাইব্রেরি সেটআপ প্রয়োজন।
  4. JManage কমান্ড লাইন কার্যকারিতা - (খারাপ দিক এটির মাধ্যমে প্রক্সি কমান্ডগুলির জন্য একটি চলমান JManage সার্ভারের প্রয়োজন)

গ্রোভি জেএমএক্স উদাহরণ:

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 উদাহরণ:

আপনি যদি একটি

  • এমবিয়ান: com.company.data:type=datasystem,id=0

অপারেশন নামে পরিচিত:

  • জেএমএক্সফোরআরফ্রেশ ()

তারপরে আপনি একটি সাধারণ বাশ স্ক্রিপ্ট লিখতে পারেন (ধরে নিই যে আপনি 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 জাভা 7 তে কাজ করছে বলে মনে হচ্ছে না bugs.launchpad.net/jmxterm/+bug/942693
আর্টব্রিজটল

19

আমি জেএমএক্সফিউজ তৈরি করেছি যা জেএমএক্স ম্বেইনসকে একটি লিনাক্স FUSE ফাইল সিস্টেম হিসাবে / proc fs এর মতো কার্যকারিতা সহ প্রকাশ করে। এটি জোলোকিয়ায় জেএমএক্সের সেতু হিসাবে নির্ভর করে । বৈশিষ্ট্য এবং ক্রিয়াকলাপ পড়া এবং লেখার জন্য উন্মুক্ত করা হয়।

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

এটি দুর্দান্ত এবং খুব দ্রুত। জেএমএক্সটার্মের জন্য 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[]{})


    }

}

এটি একটি একক। ক্লাসে সংকলন করবে এবং সার্ভারে বা কোনও জটিল মাভেন প্যাকেজিংয়ে কোনও নির্ভরতা প্রয়োজন।

সাথে এটি কল

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

4

কিছুটা ঝুঁকিপূর্ণ তবে আপনি জেএমএক্স কনসোল থেকে ফর্মের মানগুলি, এর ইউআরএল এবং http প্রমাণীকরণ (যদি প্রয়োজন হয়) দিয়ে কার্ল পোষ্ট কমান্ড চালাতে পারেন:

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

সাবধান: পদ্ধতি সূচকটি সফ্টওয়্যারটিতে পরিবর্তনগুলির সাথে পরিবর্তিত হতে পারে। এবং ওয়েব ফর্ম বাস্তবায়ন পরিবর্তন হতে পারে।

উপরেরটি আপনি যে সম্পাদনা করতে চান সেই জেএমএক্স পরিষেবা পৃষ্ঠার উত্সের ভিত্তিতে:

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করেছি এবং আমি নিশ্চিত হতে পারি যে এটি কাজ করে। (বিটিডব্লিউ। submit=Invokeঅপ্রয়োজনীয়)
টম

এটি কীভাবে কাজ করে তা বর্ণনা করা সম্ভব? আমি বলতে চাইছি ডিফল্টভাবে জেএমএক্স ব্যবহার করে rmiএবং সেখানে আমি দেখতে পাই http। এর অর্থ কী যে জেএমএক্স অনুরোধগুলি সমর্থন করার জন্য সার্ভারটি কনফিগার করা উচিত http?
সাইকোজোক

3

জে ম্যানেজে একবার দেখুন । এটি এমবিয়ান পদ্ধতিগুলি কার্যকর করতে এবং কমান্ড লাইন থেকে বৈশিষ্ট্যগুলি নির্ধারণ / সেট করতে সক্ষম ।


কমান্ড লাইন ইউটিলিটিটি কেবলমাত্র ডাউনসাইড ব্যবহারের জন্য এটি আপনার জেএমএক্স সার্ভারে প্রক্সি কমান্ডগুলিতে জেমেজকে চালিত হওয়া প্রয়োজন। আমি বরং জেএমএক্স সার্ভারে সরাসরি আরও হালকা-ওজনের পদ্ধতির চাই।
ডগনুকেম

3

আপনি jmx4perl এ একবার দেখতে চান । এটি দূরবর্তী জাভা ইই সার্ভারের এমবিগুলিতে জাভা-কম অ্যাক্সেস সরবরাহ করে। তবে, টার্গেট প্ল্যাটফর্মে একটি ছোট এজেন্ট সার্লেট স্থাপন করা দরকার যা একটি জেএসএন পে-লোডের সাথে এইচটিটিপি এর মাধ্যমে একটি বিশ্রামে জেএমএক্স অ্যাক্সেস সরবরাহ করে। (সংস্করণ 0.50 একটি JSR-160 প্রক্সি প্রয়োগ করে একটি এজেন্টলেস মোড যুক্ত করবে)।

স্থানীয় জাভা জেভিএম এবং ব্যবহারের সহজতার তুলনায় সুবিধাগুলি দ্রুত প্রারম্ভিক বার। 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);

আপনি সাধারণ এমবিয়ান / অ্যাট্রিবিউট / অপারেশন কম্বোস (যেমন বেশিরভাগ এমএক্সবিয়ানদের জন্য) ব্যবহার করতে পারেন। অতিরিক্ত বৈশিষ্ট্যগুলির জন্য (নাগিওস-প্লাগইন, এক্সপথ-জাতীয় জটিল বৈশিষ্ট্যের ধরণের অ্যাক্সেস, ...), দয়া করে jmx4perl এর ডকুমেন্টেশন দেখুন।


1

@ ডাগনুকেমের উত্তর আমাকে অনেক সাহায্য করেছে। আমি গ্রোভির পদ্ধতি গ্রহণ করেছি (গ্রুভি ২.৩.৩ ব্যবহার করে)।

আমি ডগনুকেম কোডে কিছু পরিবর্তন করেছি। এটি জাভা 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)
                    }

                }
            }

মাভেন-কম্পাইলার-প্লাগইন ব্যবহার করে এই কোডটি একটি পাত্রে সংকলন করুন যাতে আপনার কেবল গ্রোভি-অল.জারের গ্রোভি ইনস্টলেশন প্রয়োজন হবে না। নীচে সম্পর্কিত প্লাগইন সংজ্ঞা এবং নির্ভরতা রয়েছে।

   <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

বাশ-জাতীয় পরিবেশ সম্পর্কে আমি নিশ্চিত নই। আপনি জাভাতে কিছু সাধারণ মোড়কের প্রোগ্রাম চেষ্টা করতে পারেন (প্রোগ্রাম আর্গুমেন্ট সহ) যা আপনার এমবিগুলি দূরবর্তী সার্ভারে ডাকে। তারপরে আপনি শেল স্ক্রিপ্ট থেকে এই মোড়কগুলি কল করতে পারেন

আপনি যদি পাইথন বা পার্লের মতো কিছু ব্যবহার করতে পারেন তবে আপনি জেএসআর -262 এর প্রতি আগ্রহী হতে পারেন যা আপনাকে ওয়েব পরিষেবাদিগুলির মাধ্যমে জেএমএক্স ক্রিয়াকলাপ প্রকাশ করতে দেয়। এটি জাভা 7-এ অন্তর্ভুক্ত করার সময় নির্ধারিত হয়েছে তবে আপনি রেফারেন্স প্রয়োগের একটি প্রকাশ প্রার্থীকে ব্যবহার করতে সক্ষম হতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.