Pergunta

Para meus aplicativos Java com caminhos de classe muito longos, não consigo ver a classe principal especificada perto do final da lista do ARG ao usar o PS. Eu acho que isso decorre do limite de tamanho do meu sistema Ubuntu em/proc/pid/cmdline. Como posso aumentar esse limite?

Foi útil?

Solução

Você não pode mudar isso dinamicamente, o limite é codificado no kernel para Page_size no fs/proc/base.c:

 274        int res = 0;
 275        unsigned int len;
 276        struct mm_struct *mm = get_task_mm(task);
 277        if (!mm)
 278                goto out;
 279        if (!mm->arg_end)
 280                goto out_mm;    /* Shh! No looking before we're done */
 281
 282        len = mm->arg_end - mm->arg_start;
 283 
 284        if (len > PAGE_SIZE)
 285                len = PAGE_SIZE;
 286 
 287        res = access_process_vm(task, mm->arg_start, buffer, len, 0);

Outras dicas

Por olhar para os processos Java JPS é muito útil.

Isso lhe dará a classe principal e a JVM Args:

jps -vl | grep <pid>

Eu tenho temporariamente a limitação de argumento da linha de comando 4096 de caracteres de PS (ou melhor/proc/pid/cmdline) é usando um pequeno script para substituir o comando java.

Durante o desenvolvimento, eu sempre uso uma versão JDK Unpated da Sun e nunca uso o JRE ou JDK instalado do sistema operacional, independentemente de Linux ou Windows (por exemplo, faça o download da lixeira versus o RPM.Bin). Eu não recomendo alterar o script para sua instalação Java padrão (por exemplo, porque ele pode quebrar atualizações ou ser substituído ou criar problemas ou ...)

Então, assumindo que o comando java está em /x/jdks/jdk1.6.0_16_x32/bin/java

Primeiro mova o binário real para longe:

mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig

Em seguida, crie um script /x/jdks/jdk1.6.0_16_x32/bin/java como por exemplo:

    #!/bin/bash

    echo "$@" > /tmp/java.$$.cmdline
   /x/jdks/jdk1.6.0_16_x32/bin/java.orig $@

e então torne o script executado

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java

No caso de copiar e colar o exposto, você deve garantir que não haja espaços extras em /x/jdks/jdk1.6.0_16_x32/bin/java e #!/bin/bash é a primeira linha

A linha de comando completa termina em EG /tmp/java.26835.cmdline, onde 26835 é o pid do script do shell. Eu acho que também há algum limite de shell no número de argumentos da linha de comando, não consegue se lembrar, mas possivelmente eram de 64 mil caracteres.

Você pode alterar o script para remover o texto da linha de comando de /tmp/java.process_id.cmdline no final

Depois que recebi a linha de comando, sempre movo o script para algo como "java.script" e copiar (cp -a) o java binário real de volta ao java. Eu só uso o script quando atingo o limite de 4K.

Pode haver problemas com personagens escapados e talvez até espaços em caminhos ou outros, mas funciona bem para mim.

Você pode usar jconsole Para obter acesso à linha de comando original sem todos os limites de comprimento.

É possível usar distribuições Linux mais recentes, onde esse limite foi removido, por exemplo, Rhel 6.8 ou posterior

"O limite de comprimento do arquivo/proc/pid/cmdline para o comando PS era anteriormente codificado no kernel para 4096 caracteres. Esta atualização garante que o comprimento de/proc/pid/cmdline seja ilimitado, o que é especialmente útil para processos de listagem com argumentos de linha de comando longa (BZ#1100069) "

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/6.8_release_notes/new_features_kernel.html

Para programas baseados em Java, onde você está apenas interessado em inspecionar a linha de comando args sua classe principal obtida, você pode executar:

jps -m

Tenho certeza de que, se você está realmente vendo os argumentos truncados em/proc/$ pid/cmdline, você está realmente excedendo o comprimento máximo do argumento suportado pelo sistema operacional. Até onde eu sei, no Linux, o tamanho é limitado ao tamanho da página de memória. Ver Restrição de comprimento "PS WW" para referência.

A única maneira de contornar isso seria recompilar o kernel. Se você estiver interessado em ir tão longe para resolver isso, pode achar este post útil: "Lista de argumentos muito tempo": além de argumentos e limitações

Referência adicional:
Arg_max, comprimento máximo de argumentos para um novo processo

Talvez o parâmetro 'W' para PS seja o que você deseja. Adicione dois 'W' para maior saída. Ele diz ao PS para ignorar a largura da linha do terminal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top