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

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

Ответ 1

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

Ответ 2

Для рассмотрения процессов Java jps очень полезно.

Это даст вам основной класс и jvm args:

jps -vl | grep <pid>

Ответ 3

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

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

Итак, если команда java находится в /x/jdks/jdk 1.6.0_16_x32/bin/java

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

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

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

    #!/bin/bash

    echo "[email protected]" > /tmp/java.$$.cmdline
   /x/jdks/jdk1.6.0_16_x32/bin/java.orig [email protected]

а затем выполните script runnable

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

в случае копирования и вставки выше, вы должны убедиться, что в /x/jdks/jdk 1.6.0_16_x32/bin/java и #!/bin/ bash нет лишних пробелов в первой строке

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

вы можете изменить script, чтобы удалить текст командной строки из /tmp/java.PROCESS_ID.cmdline в конце

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

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

Ответ 4

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

Ответ 5

Можно использовать более новые дистрибутивы 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

Ответ 6

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

jps -m

Ответ 7

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

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

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

Ответ 8

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