Pregunta

Para mis aplicaciones Java con rutas de clase muy largas, no puedo ver la clase principal especificada cerca del final de la lista arg cuando uso ps. Creo que esto se deriva del límite de tamaño de mi sistema Ubuntu en / proc / pid / cmdline. ¿Cómo puedo aumentar este límite?

¿Fue útil?

Solución

No puede cambiar esto dinámicamente, el límite está codificado en el núcleo a PAGE_SIZE en 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);

Otros consejos

Para observar los procesos Java jps es muy útil.

Esto le dará la clase principal y los argumentos de jvm:

jps -vl | grep <pid>

Me salgo temporalmente de la limitación de argumento de la línea de comando de 4096 caracteres de ps (o más bien / proc / PID / cmdline) es mediante el uso de un pequeño script para reemplazar el comando java.

Durante el desarrollo, siempre uso una versión JDK desempaquetada de SUN y nunca uso el JRE o JDK instalado del sistema operativo sin importar si es Linux o Windows (por ejemplo, descargue el bin versus el rpm.bin). No recomiendo cambiar el script para su instalación predeterminada de Java (por ejemplo, porque podría interrumpir las actualizaciones o sobrescribirse o crear problemas o ...)

Entonces, suponiendo que el comando java esté en /x/jdks/jdk1.6.0_16_x32/bin/java

primero aleje el binario real:

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

luego cree un script /x/jdks/jdk1.6.0_16_x32/bin/java como por ejemplo:

    #!/bin/bash

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

y luego hacer que el script sea ejecutable

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

en caso de copiar y pegar lo anterior, debe asegurarse de que no haya espacios adicionales en /x/jdks/jdk1.6.0_16_x32/bin/java y #! / bin / bash es la primera línea

La línea de comando completa termina en p. ej. /tmp/java.26835.cmdline donde 26835 es el PID del script de shell. Creo que también hay un límite de shell en el número de argumentos de la línea de comandos, no puedo recordar, pero posiblemente fueron 64K caracteres.

puede cambiar el script para eliminar el texto de la línea de comando de /tmp/java.PROCESS_ID.cmdline al final

Después de obtener la línea de comandos, siempre muevo el script a algo como "java.script" y copie (cp -a) el binario real java.orig de nuevo a java. Solo uso el script cuando llego al límite de 4K.

Puede haber problemas con los caracteres escapados y tal vez incluso espacios en las rutas o algo así, pero funciona bien para mí.

Puede usar jconsole para obtener acceso a la línea de comando original sin todos los límites de longitud.

Es posible usar distribuciones de Linux más nuevas, donde se eliminó este límite, por ejemplo RHEL 6.8 o posterior

" El límite de longitud del archivo / proc / pid / cmdline para el comando ps estaba previamente codificado en el núcleo a 4096 caracteres. Esta actualización asegura que la longitud de / proc / pid / cmdline es ilimitada, lo que es especialmente útil para enumerar procesos con argumentos de línea de comando largos. (BZ # 1100069) "

https: // acceso. redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

Para los programas basados ??en Java donde solo le interesa inspeccionar los argumentos de la línea de comando que obtuvo su clase principal, puede ejecutar:

jps -m

Estoy bastante seguro de que si realmente está viendo los argumentos truncados en / proc / $ pid / cmdline, en realidad está excediendo la longitud máxima de argumento admitida por el sistema operativo. Por lo que puedo decir, en Linux, el tamaño está limitado al tamaño de la página de memoria. Consulte " ps ww " restricción de longitud para referencia.

La única forma de evitarlo sería recompilar el núcleo. Si está interesado en llegar tan lejos para resolver esto, puede encontrar útil esta publicación: " Lista de argumentos demasiado largo " ;: Más allá de argumentos y limitaciones

Referencia adicional:
ARG_MAX, longitud máxima de argumentos para un nuevo proceso

Quizás el parámetro 'w' para ps es lo que desea. Agregue dos 'w' para una mayor producción. Le dice a ps que ignore el ancho de línea del terminal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top