Como aumento o limite de bytes/proc/pid/cmdline 4096?
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?
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) "
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.