Как увеличить ограничение/proc/pid / cmdline 4096 байт?

для моих Java-приложений с очень длинными путями классов я не вижу основной класс, указанный в конце списка arg при использовании ps. Я думаю, что это связано с ограничением размера моей системы Ubuntu на /proc/pid/cmdline. Как увеличить этот лимит?

8 ответов


вы не можете изменить это динамически, ограничение жестко закодировано в ядре для PAGE_SIZE в 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);

для просмотра процессов Java jps - Это очень полезно.

Это даст вам основной класс и JVM аргументы:

jps -vl | grep <pid>

Я временно обойду ограничение аргумента командной строки 4096 символов ps (или, скорее, /proc/PID/cmdline), используя небольшой скрипт для замены команды java.

во время разработки я всегда использую распакованную версию JDK от SUN и никогда не использую установленную JRE или JDK ОС независимо от того, Linux или Windows (например. загрузите ящик против rpm.закром.) Я не рекомендую изменять сценарий для установки Java по умолчанию (например, потому что он может нарушить обновления или получить перезаписаны или создать проблемы или ...)

предположим команды Java в /Х/в JDK/jdk1.6.0_16_x32/ОГРН/Ява

сначала переместите фактический двоичный файл:

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

затем создайте скрипт / x/jdks / jdk1.6.0_16_x32/bin / java, например:

    #!/bin/bash

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

а затем сделать скрипт runnable

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

в случае копирования и вставки вышеуказанного, вы должны убедиться, что в /x/jdks/jdk1 нет дополнительных пробелов.6.0_16_x32 / bin / java и #!/bin / bash-первая строка

полная командная строка заканчивается, например, /tmp / java.26835.cmdline, где 26835-это PID сценария оболочки. Я думаю, что есть также некоторое ограничение оболочки на количество аргументов командной строки, не могу вспомнить, но это было возможно 64K символов.

вы можете изменить скрипт, чтобы удалить текст командной строки из /tmp / java.ИДЕНТИФИКАТОР ПРОЦЕССА.cmdline в конце

после того, как я получил командную строку, я всегда перемещаю скрипт на что-то вроде "ява.скрипт " и скопируйте (cp-a) фактический двоичный java.ориг возвращается на яву. Я использую скрипт только при достижении предела 4K.

могут быть проблемы с экранированными символами и, возможно, даже пробелами в путях или такими, но для меня это отлично работает.


можно использовать jconsole чтобы получить доступ к исходной командной строке без ограничения длины.


можно использовать более новые дистрибутивы linux, где этот предел был удален, например RHEL 6.8 или более поздней версии

"ограничение длины файла /proc/pid/cmdline для команды ps ранее было жестко закодировано в ядре до 4096 символов. Это обновление гарантирует, что длина /proc/pid/cmdline неограничена, что особенно полезно для перечисления процессов с длинными аргументами командной строки. (BZ#1100069)"

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


для Java-программ, где вы просто заинтересованы в проверке args командной строки вашего основного класса, вы можете запустить:

jps -m

Я уверен, что если вы действительно видите аргументы, усеченные в /proc/$pid/cmdline, то вы фактически превышаете максимальную длину аргумента, поддерживаемую ОС. Насколько я могу судить, в Linux размер ограничен размером страницы памяти. См." ps ww " ограничение длины для справки.

единственный способ обойти это - перекомпилировать ядро. Если вы заинтересованы в том, чтобы зайти так далеко, чтобы решить эту проблему, вы можете найти этот пост полезным: "список аргументов слишком длинный": за пределами аргументов и ограничений

дополнительная ссылка:
ARG_MAX, максимальная длина аргументов для нового процесса


возможно, параметр " w " для ps-это то, что вы хотите. Добавьте два "w"для большего вывода. Он говорит ps игнорировать ширину линии терминала.