Frage

Für meine Java-Anwendungen mit sehr langen CLASSPATHs, kann ich sehen, die Hauptklasse nicht in der Nähe des Endes der arg Liste angegeben wird, wenn ps. Ich denke, das stammt von meinem Ubuntu-System Größenbeschränkung auf / proc / pid / cmdline. Wie kann ich diese Grenze erhöhen?

War es hilfreich?

Lösung

Sie können dies nicht dynamisch ändern, die Grenze ist hartcodiert im Kernel 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);

Andere Tipps

auf Java-Prozesse suchen JPS ist sehr nützlich.

Dies gibt Ihnen die Hauptklasse und Jvm argumente:

jps -vl | grep <pid>

ich vorübergehend um die 4096 Zeichen Befehlszeilenargument Begrenzung von ps (oder vielmehr / proc / PID / cmdline) ist durch ein kleines Skript mit dem Befehl java zu ersetzen.

Während der Entwicklung, habe ich immer eine entpackte Version JDK von SUN verwenden und niemals die installierte JRE oder JDK des OS ganz gleich verwenden, wenn Linux oder Windows (z. B. das Fach gegenüber dem rpm.bin herunterladen). Ich empfehle nicht, das Skript für Ihre Standard-Java-Installation zu ändern (zum Beispiel, weil es Updates brechen könnte oder erhalten überschrieben oder erstellen Sie Probleme oder ...)

den Befehl java also unter der Annahme ist in /x/jdks/jdk1.6.0_16_x32/bin/java

zunächst die tatsächliche binäre wegbewegen:

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

dann ein Skript erstellen /x/jdks/jdk1.6.0_16_x32/bin/java z mag:.

    #!/bin/bash

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

und dann das Skript runnable machen

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

bei kopieren und einfügen und den oben genannten, sollten Sie darauf achten, dass es keine zusätzlichen Räume in /x/jdks/jdk1.6.0_16_x32/bin/java und #! / Bin / bash ist die erste Zeile

Die vollständige Befehlszeile endet in z.B. /tmp/java.26835.cmdline wo 26835 ist die PID des Shell-Skript. Ich denke, es gibt auch einige Shell-Limit für die Anzahl von Befehlszeilenargumente, kann mich nicht erinnern, aber es war vielleicht 64K Zeichen.

Sie können das Skript ändern, um die Befehlszeile Text von /tmp/java.PROCESS_ID.cmdline zu entfernen am Ende

Nachdem ich die Kommandozeile bekam, habe ich immer das Skript so etwas wie „java.script“ bewegen und kopieren (cp -a) die tatsächlichen binären java.orig zurück zu Java. Ich habe nur das Skript verwenden, wenn ich die 4K-Grenze erreicht.

Es könnte Probleme mit Escape-Zeichen und vielleicht sogar Räume in Pfade oder so sein, aber es funktioniert gut für mich.

Sie jconsole verwenden können, ohne all die Länge beschränkt den Zugriff auf die ursprüngliche Befehlszeile zu erhalten.

Es ist möglich, neuere Linux-Distributionen zu verwenden, wobei diese Grenze entfernt wurde, beispielsweise RHEL 6.8 oder höher

"Das / proc / pid / cmdline Dateilänge Grenze für den Befehl ps zuvor wurde in den Kernel zu 4096 Zeichen hartcodiert. Dieses Update stellt sicher, dass die Länge von / proc / pid / cmdline ist unbegrenzt, die ist besonders nützlich für Prozesse mit langen Befehlszeilenargumenten. (BZ # 1100069) "

Listing

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

Für Java-basierte Programme, bei denen Sie nur daran interessiert sind bei der Inspektion der Befehlszeile args Ihre Hauptklasse erhalten haben, können Sie ausführen:

jps -m

Ich bin mir ziemlich sicher, dass, wenn Sie sehen tatsächlich die abgeschnittenen Argumente in / proc / $ pid / cmdline dann sind Sie tatsächlich die maximale Argument Länge vom O unterstützt übersteigen. Soweit ich das beurteilen kann, in Linux ist die Größe auf die Speicherseitengröße begrenzt. Siehe "ps ww" Längenbeschränkung Referenz.

Der einzige Weg, um das zu bekommen wäre, den Kernel neu zu kompilieren. Wenn Sie in gehen so weit interessiert sind, dies zu lösen, dann können Sie diesen Beitrag nützlich finden: "Argument-Liste zu long ": Beyond Argumente und Einschränkungen

Weitere Referenz:
ARG_MAX, maximale Länge der Argumente für einen neuen Prozess

Vielleicht ist die ‚w‘ Parameter ps ist, was Sie wollen. Fügen Sie zwei ‚w‘ für mehr Leistung. Es erzählt ps die Linienbreite des Terminals zu ignorieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top