Как увеличить ограничение/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)"
для Java-программ, где вы просто заинтересованы в проверке args командной строки вашего основного класса, вы можете запустить:
jps -m
Я уверен, что если вы действительно видите аргументы, усеченные в /proc/$pid/cmdline, то вы фактически превышаете максимальную длину аргумента, поддерживаемую ОС. Насколько я могу судить, в Linux размер ограничен размером страницы памяти. См." ps ww " ограничение длины для справки.
единственный способ обойти это - перекомпилировать ядро. Если вы заинтересованы в том, чтобы зайти так далеко, чтобы решить эту проблему, вы можете найти этот пост полезным: "список аргументов слишком длинный": за пределами аргументов и ограничений
дополнительная ссылка:
ARG_MAX, максимальная длина аргументов для нового процесса
возможно, параметр " w " для ps-это то, что вы хотите. Добавьте два "w"для большего вывода. Он говорит ps игнорировать ширину линии терминала.