当前位置: 首页 > 知识库问答 >
问题:

从本地触发远程服务器上的快照

太叔昊穹
2023-03-14

我试图远程评测运行在64位linux服务器上的alfresco,该服务器运行1.8 JVM和Apache Tomcat 7。xx来自我的测试代码,但不知道如何通过编程触发快照。

我想做的是连接到远程服务器,开始分析,并从用Java编写的测试代码中将该服务器性能的快照保存到本地机器上。

我已经在linux服务器上安装了JProfiler 9.2,可以通过JProfiler GUI连接并拍摄快照。为了安全起见,服务器还需要SSH连接。我想从我的代码中实现这一点,类似于控制器。saveSnapshot(文件)适用于本地JVM。

这可能吗?

我知道我可以设置触发器并让远程分析器在服务器上保存快照,但这不是我想要的。

此外,我研究了使用命令行控制器,但即使在远程VM选项中有正确的参数,也无法使其连接到服务器。

我还尝试使用ConnectionFactor.createRemteConnection(),但没有看到允许输入密码的参数,因此失败。

共有1个答案

房学
2023-03-14

您可以通过编程方式访问JProfiler MBean。下面是一个如何做到这一点的例子。我会在远程机器上运行这样的程序,并通过SSH启动它,因为JMX连接很难通过SSH进行隧道连接。

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

// Shows how to connect to the the JProfiler MBean programatically
// The profiled process has to be in offline profiling mode and the JMX server
// has to be started by passing -Djprofiler.jmxServerPort=[port] to the profiled JVM.
// This will not work in nowait mode because the MBean is not registered in that case.
public class MBeanProgrammaticAccessExample {

    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            System.out.println("Specify the port as an argument that was passed to " +
                    "the profiled JVM with the VM parameter " +
                    "-Djprofiler.jmxServerPort=[port]");
        }
        String port = args[0];
        // In this case the connection is made to a process on localhost, but it could
        // be on a remote system as well. Note that the connection is made via JMX which
        // does not work well with firewalls
        System.out.println("Connecting to localhost:" + port);
        JMXServiceURL jmxUrl = new JMXServiceURL(
                "service:jmx:rmi:///jndi/rmi://localhost:" + port + "/jmxrmi");
        JMXConnector connector = JMXConnectorFactory.newJMXConnector(jmxUrl, 
                Collections.<String, Object>emptyMap());

        Map<String, Object> env = new HashMap<>();

        // If you have protected the JMX server with a JMX password file by passing 
        // -Djprofiler.jmxPasswordFile=[file] to the profiled JVM, you can specify 
        // the password like this:
        //env.put(JMXConnector.CREDENTIALS, new String[] {"username", "password"});

        connector.connect(env);
        MBeanServerConnection connection = connector.getMBeanServerConnection();
        ObjectName objectName = new ObjectName(
                "com.jprofiler.api.agent.mbean:type=RemoteController");
        if (!connection.isRegistered(objectName)) {
            throw new RuntimeException("JProfiler MBean not found.");
        }

        RemoteControllerMBean mbeanProxy = JMX.newMBeanProxy(connection, 
                objectName, RemoteControllerMBean.class, true);

        // You can look up all available operations in the javadoc of 
        // com.jprofiler.api.agent.mbean.RemoteControllerMBean
        System.out.println("Recording CPU data for 5 seconds ....");
        mbeanProxy.startCPURecording(true);
        // If you do not want a dependency on the JProfiler classes 
        // you can make the above call like this:
        //connection.invoke(objectName, "startCPURecording", new Object[] {true},
        // new String[] {Boolean.TYPE.getName()});

        Thread.sleep(5000);
        System.out.println("Saving snapshot to the working directory " +
                "of the profiled JVM ....");
        mbeanProxy.saveSnapshot("snapshot.jps");

        connector.close();
        System.out.println("Success");

    }
}
 类似资料:
  • 问题内容: 我正在调试一些必须在我的虚拟机上运行的python脚本。而且,我更喜欢在本地(虚拟机外部)编辑脚本。因此,我发现每次都将脚本修改为虚拟机 很繁琐。谁能提出一些有效的方法? 特别是,我想知道是否可以在远程PVM上执行python脚本。像这样: 问题答案: 可以使用ssh。Python接受连字符(-)作为执行标准输入的参数, 运行 python –help 以获得更多信息。

  • 我有: 本地PyCharm 带有docker容器的远程服务器 我想在远程docker容器Python解释器中运行本地PyCharm代码(远程服务器上的代码),以便调试。怎么设置? 我还在互联网上找到了一些文章,其中包含我不需要的以下描述: 地方魅力-

  • 问题内容: 是否可以从本地html / js文件(例如file://home/a.html)向远程服务器(例如http:// domain:8080 / api )进行AJAX调用(例如,使用jQuery.ajax()))?如果是,如何启用这种XSS(例如在FF3中)? 我想这是某些浏览器的安全设置,但是找不到哪个。 并假设有一个没有任何服务器端更改(例如JSONP)的答案。 谢谢。 程式码片段:

  • 当在远程服务器上运行脚本时,我需要防止远程服务器的nohup输出显示在ssh服务器上。 我正在命令行下面运行,以便在远程服务器上运行脚本。 但是当它运行时,它不可预测地显示“远程服务器脚本”中的命令的nohup输出。下面是脚本的节选,您可以看到该命令应该在后台运行。 我如何使它在远程服务器上的运行方式与在家庭服务器上的运行方式相同?我真的很感谢你的帮助。

  • 问题内容: 给定远程服务器“生产”(当前可通过IP访问)和本地数据库“开发”,如何使用T-SQL从“生产”运行到“开发”? 我使用的是MS SQL 2005,这两个数据库之间的表结构有很大不同,因此需要我手动编写一些迁移脚本。 更新: T-SQL确实不是我的包。我尝试了以下操作(不知道自己在做什么): 我得到了错误: 用户“”登录失败。该用户未与受信任的SQL Server连接关联。 问题答案:

  • 尝试远程启动服务时遇到奇怪的行为。 编辑:我进一步研究了这个问题,发现只有在尝试运行我的特定服务时才会出现这种情况。这意味着我的服务必须从已经登录的用户的会话中运行(这就是为什么如果我之前使用mstsc访问服务器,它仍然可以工作)。所以我想我的新问题是--有没有一种方法可以让我从PowerShell登录到远程机器? 多谢了。