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?
Respuesta
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);
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
Se puede ajustar cualquier cosa si está dispuesto a recompilar el kernel pero aún no se puede cambiar dinámicamente. –
Recompilar el kernel es como mudarse a una casa nueva porque no le gustó el sofá anterior. –
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.
No, incluso con ww, se trunca en 4096. Creo que ps está leyendo de/prod/pid/cmdline, que también está truncado. – user27635
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
@Jay lamentablemente parece que no es ilimitado, está limitado a 4096 caracteres – AJP
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
-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
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í.
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
Gran solución para ver la línea de comando completa, la he usado también para javac – stivlo
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. –
Puede usar jconsole
para obtener acceso a la línea de comando original sin todos los límites de longitud.
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
Para ver los procesos de Java jps es muy útil.
Esto le dará la clase y JVM principales argumentos:
jps -vl | grep <pid>
Incluso peor para mí. Trunca rápidamente – HaveAGuess
@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.) –
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
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
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)"
- 1. ¿Cómo aumentar el límite de gráfico en LINQPad?
- 2. Joomla aumentar límite de tiempo límite de sesión frontend
- 3. ¿Cómo aumentar el límite de error en Visual Studio?
- 4. _jspService excede el límite de 65535 bytes
- 5. (Cómo) puedo aumentar el límite de cuota de LocalStorage en Android WebView
- 6. cómo aumentar Apache 2 uri límite de longitud
- 7. Matriz que no cruza el límite de 256 bytes
- 8. ¿Cómo aumentar el tamaño de bytes [] en el tiempo de ejecución?
- 9. ¿Cómo aumentar el límite de memoria para PHP de más de 2 GB?
- 10. Cómo aumentar el límite de "archivos máximos abiertos" en C en Mac OS X
- 11. ¿Cómo aumentar el límite de error de 100 errores en IntelliJ IDEA?
- 12. ¿cómo puedo aumentar el tamaño de este SVG?
- 13. ¿Cómo puedo aumentar el tamaño de la pila en Python?
- 14. ¿Cómo puedo aumentar el tamaño de la pila con runhaskell?
- 15. Cómo solucionar "El código de método ... excede el límite de 65535 bytes"?
- 16. ¿Cómo puedo aumentar el tamaño de la cadena que puede visualizar un visualizador de depurador externo?
- 17. Cómo puedo aumentar el rendimiento SSL del servidor
- 18. ¿Cómo puedo aumentar el tamaño del montón .NET?
- 19. En git, ¿cómo puedo aumentar el contexto para las fusiones?
- 20. ¿Cómo puedo aumentar el rendimiento del siguiente código?
- 21. ¿Cómo puedo cambiar el límite de tiempo para webClient.UploadData()?
- 22. Aumentar el enlace estático
- 23. MSTest: cómo aumentar el tiempo de prueba
- 24. ¿Cómo cambio el límite de archivos abiertos en Linux?
- 25. ¿Cómo puedo aumentar la altura de un cuadro de texto sin Multiline = "true" o aumentar el tamaño de la fuente?
- 26. ¿Puedo aumentar botones en el área de clic programáticamente?
- 27. Aumentar el espacio permgen
- 28. ¿Cómo puedo convertir POI HSSFWorkbook en bytes?
- 29. escribir llamada al sistema, ¿cuál es el número de bytes límite?
- 30. Enum excediendo el límite de 65535 bytes del inicializador estático ... ¿qué es lo mejor?
ser un no-Java-chico, me pregunto cómo ejecutar que en Windows. XP tenía un límite de, creo, 2048. –