Wie erhöhe ich die / proc / pid / cmdline 4096 Byte-Grenze?
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?
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) "
ListingFü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.