Parece que nunca fiz isso funcionar no passado. Atualmente, SEI que não funciona.
Mas iniciamos nosso processo Java:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Eu posso telnetar para a porta e "algo está lá" (ou seja, se eu não iniciar o processo, nada responde, mas se eu iniciar, ele inicia), mas não consigo fazer o JConsole funcionar preenchendo o IP e porta.
Parece que deveria ser tão simples, mas sem erros, sem ruído, sem nada. Simplesmente não funciona.
Alguém sabe a dica quente para isso?
Respostas:
Eu tenho uma solução para isso:
Se o seu processo Java estiver sendo executado no Linux atrás de um firewall e você deseja iniciar o JConsole / Java VisualVM / Java Mission Control no Windows em sua máquina local para conectá-lo à porta JMX do seu processo Java .
Você precisa acessar sua máquina Linux via login SSH. Toda a comunicação será encapsulada pela conexão SSH.
DICA: Esta solução funciona independentemente da existência de firewall ou não.
Desvantagem: sempre que reiniciar o processo java, você precisará executar todas as etapas de 4 a 9 novamente.
1. Você precisa do conjunto de massa para a sua máquina Windows a partir daqui:
2. Defina uma porta livre em sua máquina Linux:
Exemplo:
3. Adicione argumentos para o processo java na máquina Linux
Isso deve ser feito exatamente assim. Se for feito como a seguir, funciona para máquinas Linux atrás de firewalls (funciona por causa do
-Djava.rmi.server.hostname=localhost
argumento).Exemplo:
4. Obtenha a Id do processo de seu processo Java
Exemplo:
5. Encontre uma porta arbitrária para download de stubs RMIServer
O processo java abre uma nova porta TCP na máquina linux, onde os Stubs do servidor RMI estarão disponíveis para download. Essa porta também precisa estar disponível por meio do túnel SSH para obter uma conexão com a Java Virtual Machine.
Com
netstat -lp
esta porta pode ser encontrada também alsof -i
dá dicas de qual porta foi aberta do processo java.NOTA: Esta porta sempre muda quando o processo java é iniciado.
Exemplo:
6. Habilite dois túneis SSH de sua máquina Windows com massa
Exemplo:
7. Faça login em sua máquina Linux com Putty com este túnel SSH ativado.
Deixe a sessão de massa aberta.
Quando você estiver logado, o Putty fará um túnel de todas as conexões TCP para a máquina Linux através da porta 22 SSH.
Porta JMX:
RMIServer-Stub-Port:
8. Inicie o JConsole / Java VisualVM / Java Mission Control para se conectar ao seu processo Java usando a seguinte URL
Isso funciona, porque o JConsole / Java VisualVM / Java Mission Control pensa que você se conectou a uma porta em sua máquina Windows local. mas Putty envia toda a carga útil para a porta 15666 para sua máquina Linux.
Na máquina linux, primeiro o processo java responde e envia de volta a porta RMIServer. Neste exemplo 37123.
Então JConsole / Java VisualVM / Java Mission Control pensa que se conecta ao localhost: 37123 e o putty enviará toda a carga útil para a máquina Linux
O processo java responde e a conexão é aberta.
Exemplo:
9. APROVEITE # 8-]
fonte
Adicionar
-Djava.rmi.server.hostname='<host ip>'
resolveu esse problema para mim.fonte
Tentei com Java 8 e versões mais recentes
Esta solução também funciona bem com firewalls
1. Adicione isso ao seu script de inicialização java no host remoto:
2. Execute no seu computador.
Usuários do Windows :
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Usuários Linux e Mac :
ssh user@remote-host -L 1616:remote-host:1616
3. Comece
jconsole
no seu computador4. Divirta-se!
PS: durante a etapa 2, usando
ssh
e-L
você especifica que a porta 1616 no host local (cliente) deve ser encaminhada para o lado remoto. Este é um túnel ssh e ajuda a evitar firewalls ou vários problemas de rede.fonte
Provavelmente, você está tendo problemas com um firewall. O 'problema' é que a porta que você especificou não é a única porta usada, ela usa 1 ou talvez até mais 2 portas para RMI, e essas provavelmente estão bloqueadas por um firewall.
Uma das portas extras não será conhecida de antemão se você usar a configuração RMI padrão, então você tem que abrir uma grande variedade de portas - o que pode não divertir o administrador do servidor.
Há uma solução que não requer a abertura de muitas portas, no entanto, eu a fiz funcionar usando os snippets de origem combinados e dicas de
http://forums.sun.com/thread.jspa?threadID=5267091- o link não funciona maishttp://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
É até possível configurar um túnel ssh e ainda fazê-lo funcionar :-)
fonte
forums.sun.com
está quebradoblogs.oracle.com
está quebrado.Depois de testar meu Google-fu nos últimos dias, finalmente consegui fazer isso funcionar depois de compilar as respostas do Stack Overflow e desta página http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html .
Repostagem da página Dell Boomi:
A única linha que eu não vi nenhuma capa de resposta do Stack Overflow é
No meu caso, eu estava tentando recuperar as métricas Kakfa, então simplesmente alterei a opção acima para corresponder ao
-Dcom.sun.management.jmxremote.port
valor. Portanto, sem autenticação de qualquer tipo, a configuração mínima deve ser semelhante a esta:fonte
Você está rodando em Linux? Talvez o agente de gerenciamento esteja vinculado ao host local:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
fonte
As etapas 4 a 7 de Sushicutta podem ser ignoradas adicionando a seguinte linha à etapa 3:
por exemplo, adicionar parâmetros de inicialização:
Para o encaminhamento de porta, conecte-se usando:
se o seu host for um degrau, simplesmente encadeie a porta executando o seguinte na degrau após o anterior:
Lembre-se de que hostname = localhost é necessário para garantir que o jmxremote esteja informando a conexão rmi para usar o túnel. Caso contrário, ele pode tentar se conectar diretamente e atingir o firewall.
fonte
ssh -L <JMX_port>:localhost:<JMX_port> <remote_user>@<remote_host>
na máquina local (3) Em seguida, eu me conecto ao JMX remoto usando:jconsole <remote_host>:<JMX_port>
PROTIP:
As portas RMI são abertas em portnrs arbitrários. Se você tiver um firewall e não quiser abrir as portas 1024-65535 (ou usar vpn), faça o seguinte.
Você precisa consertar (como se tivesse um número conhecido) o registro RMI e as portas do servidor JMX / RMI. Você faz isso colocando um arquivo jar (catalina-jmx-remote.jar está no extra) no lib-dir e configurando um ouvinte especial no servidor:
(E, claro, os sinalizadores usuais para ativar JMX
Consulte: JMX Remote Lifecycle Listener em http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html
Então você pode se conectar usando este URL horrível:
fonte
Verifique se o seu servidor está protegido por firewall. JMX é baseado em RMI, que abre duas portas quando é iniciado. Uma é a porta de registro, o padrão é 1099 e pode ser especificada pela
com.sun.management.jmxremote.port
opção. O outro é para comunicação de dados, e é aleatório, o que causa o problema. Uma boa notícia é que, a partir do JDK6, essa porta aleatória pode ser especificada pelacom.sun.management.jmxremote.rmi.port
opção.fonte
Obter JMX por meio do Firewall é muito difícil. O problema é que o RMI padrão usa uma segunda porta atribuída aleatoriamente (ao lado do registro RMI).
Temos três soluções que funcionam, mas cada caso precisa de uma diferente:
JMX sobre túnel SSH com proxy Socks, usa RMI padrão com magia SSH http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
JMX MP (alternativa ao RMI padrão), usa apenas uma porta fixa, mas precisa de um jar especial no servidor e no cliente http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/
Inicie o código de formulário do servidor JMX, lá é possível usar RMI padrão e usar uma segunda porta fixa: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055
fonte
Ao testar / depurar / diagnosticar problemas JMX remotos , primeiro sempre tente se conectar no mesmo host que contém o MBeanServer (ou seja, localhost), para descartar a rede e outros problemas específicos não JMX.
fonte
Já existem algumas respostas excelentes aqui, mas existe uma abordagem um pouco mais simples que acho que vale a pena compartilhar.
A abordagem do sushicutta é boa, mas é muito manual, pois você precisa obter a porta RMI todas as vezes. Felizmente, podemos contornar isso usando um proxy SOCKS em vez de abrir explicitamente os túneis de porta. A desvantagem desta abordagem é que o aplicativo JMX que você executa em sua máquina precisa ser configurado para usar um proxy. Na maioria dos processos, você pode fazer isso adicionando propriedades java, mas alguns aplicativos não oferecem suporte para isso.
Passos:
Adicione as opções JMX ao script de inicialização para seu serviço Java remoto:
Configure uma conexão proxy SOCKS para sua máquina remota:
Configure seu aplicativo de monitoramento Java local para usar o proxy SOCKS (localhost: 9696). Observação: às vezes você pode fazer isso na linha de comando, ou seja:
fonte
O seguinte funcionou para mim (embora eu ache que a porta 2101 realmente não contribuiu para isso):
Estou me conectando de uma máquina remota a um servidor que tem o Docker em execução e o processo está dentro do contêiner. Além disso, parei o firewallD, mas não acho que esse seja o problema, pois eu poderia telnet para 2100 mesmo com o firewall aberto. Espero que ajude.
fonte
Estou executando o JConsole / JVisualVm no Windows conectando-se ao Tomcat executando o Linux Redhat ES3.
Desativar a filtragem de pacotes usando o seguinte comando funcionou para mim:
em que jconsole-host é o nome do host ou o endereço do host no qual o JConsole é executado e jmxremote-port é o número da porta definido para com.sun.management.jmxremote.port para gerenciamento remoto.
fonte
Estou usando o boot2docker para executar contêineres do docker com o Tomcat interno e estou com o mesmo problema, a solução era:
-Djava.rmi.server.hostname=192.168.59.103
docker run ... -p 9999:9999 ...
. Usar portas diferentes não funciona.fonte
Você também precisa se certificar de que o nome da máquina seja resolvido para o IP ao qual o JMX está vinculado; NÃO localhost nem 127.0.0.1. Para mim, ajudou a colocar uma entrada em hosts que define isso explicitamente.
fonte
Fazer o JMX passar pelo firewall não é tão difícil. Existe um pequeno problema. Você deve encaminhar ambas as portas configuradas JMX, ou seja. 9010 e uma das portas dinâmicas que escuta na minha máquina era> 30000
fonte
Estas são as etapas que funcionaram para mim (debian atrás do firewall no lado do servidor, acessado por VPN do meu Mac local):
verificar ip do servidor
usar parâmetros JVM:
executar aplicativo
encontrar pid do processo java em execução
verifique todas as portas usadas por JMX / RMI
abra todas as portas da etapa 5 no firewall
Voila.
fonte
Para dar uma contribuição, foi o que fiz no CentOS 6.4 para Tomcat 6.
Desligar serviço iptables
Adicione a seguinte linha a tomcat6.conf
Desta forma, consegui me conectar de outro PC usando JConsole.
fonte
Estou tentando JMC para executar o Flight Recorder (JFR) para o perfil NiFi em um servidor remoto que não oferece um ambiente gráfico no qual executar o JMC.
Com base nas outras respostas fornecidas aqui, e após muitas tentativas e erros, aqui está o que estou fornecendo para a JVM ( conf / bootstrap.conf ) quando inicio o NiFi:
Coloquei isso em / etc / hosts , embora duvide que seja necessário:
Então, ao iniciar o JMC, crio uma conexão remota com estas propriedades:
A propósito, se eu clicar no URL do serviço JMX personalizado, vejo:
Isso finalmente funcionou por mim.
fonte