2008-10-13 11 views
39

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

+0

ser un no-Java-chico, me pregunto cómo ejecutar que en Windows. XP tenía un límite de, creo, 2048. –

Respuesta

19

no se puede cambiar esta dinámica, el límite está codificada en el kernel para 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); 
+0

Tenga en cuenta que esto se puede ajustar si está dispuesto a recompilar el kernel para hacerlo (ver mi comentario para un enlace de instrucciones). – Jay

+4

Se puede ajustar cualquier cosa si está dispuesto a recompilar el kernel pero aún no se puede cambiar dinámicamente. –

+12

Recompilar el kernel es como mudarse a una casa nueva porque no le gustó el sofá anterior. –

-3

Tal vez el parámetro 'w' para ps es lo que quiere. Agregue dos 'w' para una salida mayor. Le dice a ps que ignore el ancho de línea de la terminal.

+2

No, incluso con ww, se trunca en 4096. Creo que ps está leyendo de/prod/pid/cmdline, que también está truncado. – user27635

+0

Solo para aclarar lo que @Caskey dijo con "Agregar dos para una mayor salida", eso es -w -w (o -ww) para ancho ilimitado en la salida – Jay

+0

@Jay lamentablemente parece que no es ilimitado, está limitado a 4096 caracteres – AJP

-2

Estoy bastante seguro de que si realmente está viendo los argumentos truncados en/proc/$ pid/cmdline, en realidad está excediendo la longitud máxima del 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. Ver "ps ww" length restriction para referencia.

La única forma de evitar eso sería recompilar el kernel. Si estás interesado en ir tan lejos para resolver este, puede que encuentre este post útil: "Argument list too long": Beyond Arguments and Limitations

referencia adicional:
ARG_MAX, maximum length of arguments for a new process

+2

-1. La primera parte de tu comentario no es correcta. En mi sistema, 'getconf ARG_MAX' dice' ARG_MAX = 2097152' (lo que significa que mi longitud máxima de argumento es 2 megabytes). Sin embargo, '/ proc/$ pi d/cmdline' se trunca en 'PAGE_SIZE', que es 4096. Tu enlace de instrucciones NO cubre esta situación específica. No tengo idea de si al cambiar el bit relevante en' fs/proc/base.c' se causarían otros problemas. – jnylen

8

me temporalmente moverse por la 4096 caracteres argumento de línea de comandos limitación de PS (o más bien/proc/PID/cmdline) es mediante el uso de un pequeño script para reemplace el comando java.

Durante el desarrollo, siempre utilizo una versión JDK sin empaquetar 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 frente a rpm.bin). No recomiendo cambiar la secuencia de comandos para su instalación Java predeterminada (por ejemplo, porque podría romper actualizaciones o sobrescribirse o crear problemas o ...)

Asumiendo que el comando java está en /x/jdks/jdk1.6.0 _16_x32/bin/java

primer movimiento el binario real de distancia:

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

entonces crear un guión /x/jdks/jdk1.6.0_16_x32/bin/java como, por ejemplo:

#!/bin/bash 

    echo "[email protected]" > /tmp/java.$$.cmdline 
    /x/jdks/jdk1.6.0_16_x32/bin/java.orig [email protected] 

y luego hacer que el script ejecutable

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

en caso de copiar y pegar lo anterior, usted debe asegurarse de que no hay 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, por ejemplo /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 recuerdo, pero posiblemente tenía 64K caracteres.

puede cambiar la secuencia de comandos para quitar el texto de la línea de comandos desde /tmp/java.PROCESS_ID.cmdline al final

Después llegué a la línea de comandos, siempre me muevo el guión a algo así como "java.script "y copie (cp -a) el binario real java.orig de nuevo a java. Solo uso el script cuando alcanzo el límite 4K.

Puede haber problemas con los caracteres que se han escapado y tal vez incluso espacios en los caminos, pero funciona bien para mí.

+0

Esta es probablemente la forma más fácil de hacerlo. También puede establecer la variable de entorno 'CLASSPATH' solo para ese comando específico, o dividir las rutas necesarias entre' CLASSPATH' y la línea de comando. – jnylen

+0

Gran solución para ver la línea de comando completa, la he usado también para javac – stivlo

+0

Si tiene acceso al ejecutable java real utilizado (por ejemplo, en Eclipse), puede omitir el movimiento del binario y solo crear el script que imprime la línea de comando (a un archivo) y luego inicia la aplicación java. Asegúrese de colocar la secuencia de comandos en la carpeta JDK bin. –

6

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

+1

puede funcionar y aumenta el límite de longitud, pero para una línea de comando realmente enorme ya no funciona y se trunca (lo experimenté). – stivlo

27

Para ver los procesos de Java jps es muy útil.

Esto le dará la clase y JVM principales argumentos:

jps -vl | grep <pid> 
+1

Incluso peor para mí. Trunca rápidamente – HaveAGuess

+1

@HaveAGuess, wfm: muestra la clase principal, sin importar cuán obscenamente larga sea la classpath, que es lo que solicitó OP. (También puede mostrar opcionalmente otros argumentos.) –

+0

También funciona para mí, muestra todos los parámetros para líneas de comandos de Weblogic increíblemente largas (más de 4096 caracteres) (Linux 64 bits). Gracias Kevin! – t0r0X

0

Para los programas basados ​​en Java en el que están interesados ​​sólo en la inspección de la línea de comandos ARGS consiguió su clase principal, puede ejecutar:

jps -m 
2

es posible utilizar nuevas distribuciones de Linux, donde se eliminó este límite, por ejemplo RHEL 6.8 o posterior

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

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

Cuestiones relacionadas