Domanda

Per le mie app Java con percorsi di classe molto lunghi, non riesco a vedere la classe principale specificata vicino alla fine dell'elenco arg quando uso ps. Penso che questo derivi dal limite di dimensioni del mio sistema Ubuntu su / proc / pid / cmdline. Come posso aumentare questo limite?

È stato utile?

Soluzione

Non è possibile modificarlo in modo dinamico, il limite è codificato nel kernel su PAGE_SIZE in 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);

Altri suggerimenti

Per esaminare i processi Java jps è molto utile.

Questo ti darà la classe principale e jvm args:

jps -vl | grep <pid>

Ho temporaneamente aggirato la limitazione dell'argomento della riga di comando di 4096 caratteri di ps (o piuttosto / proc / PID / cmdline) usando un piccolo script per sostituire il comando java.

Durante lo sviluppo, utilizzo sempre una versione JDK decompressa di SUN e non utilizzo mai il JRE o JDK installato del sistema operativo, indipendentemente dal fatto che Linux o Windows (ad esempio, scarichi il cestino rispetto a rpm.bin). Non consiglio di modificare lo script per l'installazione Java predefinita (ad es. Perché potrebbe interrompere gli aggiornamenti o essere sovrascritto o creare problemi o ...)

Supponendo quindi che il comando java sia in /x/jdks/jdk1.6.0_16_x32/bin/java

per prima cosa sposta il file binario effettivo:

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

quindi crea uno script /x/jdks/jdk1.6.0_16_x32/bin/java come ad es .:

    #!/bin/bash

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

e quindi rendere eseguibile lo script

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

in caso di copia e incolla di quanto sopra, dovresti assicurarti che non ci siano spazi extra in /x/jdks/jdk1.6.0_16_x32/bin/java e #! / bin / bash è la prima riga

La riga di comando completa finisce ad es. /tmp/java.26835.cmdline dove 26835 è il PID dello script della shell. Penso che ci sia anche un limite alla shell sul numero di argomenti della riga di comando, non ricordo ma era probabilmente di 64 KB.

puoi cambiare lo script per rimuovere il testo della riga di comando da /tmp/java.PROCESS_ID.cmdline alla fine

Dopo aver ottenuto la riga di comando, sposto sempre lo script in qualcosa di simile a " java.script " e copia (cp -a) il vero binario java.orig di nuovo su java. Uso lo script solo quando raggiungo il limite 4K.

Potrebbero esserci problemi con caratteri di escape e forse anche spazi in percorsi o simili, ma funziona bene per me.

Puoi usare jconsole per accedere alla riga di comando originale senza tutti i limiti di lunghezza.

È possibile utilizzare le più recenti distribuzioni di Linux, dove questo limite è stato rimosso, ad esempio RHEL 6.8 o successivo

" Il limite di lunghezza del file / proc / pid / cmdline per il comando ps era precedentemente codificato nel kernel su 4096 caratteri. Questo aggiornamento assicura che la lunghezza di / proc / pid / cmdline sia illimitata, il che è particolarmente utile per elencare i processi con lunghi argomenti da riga di comando. (BZ # 1.100.069) "

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

Per i programmi basati su Java in cui sei solo interessato a ispezionare la riga di comando che la tua classe principale ha, puoi eseguire:

jps -m

Sono abbastanza sicuro che se stai effettivamente vedendo gli argomenti troncati in / proc / $ pid / cmdline, stai effettivamente superando la lunghezza massima degli argomenti supportata dal sistema operativo. Per quanto posso dire, in Linux, la dimensione è limitata alla dimensione della pagina di memoria. Vedi " ps ww " limitazione di lunghezza per riferimento.

L'unico modo per aggirare sarebbe quello di ricompilare il kernel. Se sei interessato ad andare così lontano per risolverlo, potresti trovare utile questo post: " Elenco argomenti troppo lungo " ;: Beyond Argomenti e limitazioni

Riferimento aggiuntivo:
ARG_MAX, lunghezza massima degli argomenti per un nuovo processo

Forse il parametro 'w' per ps è quello che vuoi. Aggiungi due 'w' per un output maggiore. Indica a ps di ignorare la larghezza della linea del terminale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top