Как увеличить лимит / proc / pid / cmdline 4096 байт?
Вопрос
Для моих приложений Java с очень длинными путями классов я не вижу основной класс, указанный в конце списка аргументов при использовании ps. Я думаю, это связано с ограничением размера моей системы Ubuntu на / proc / pid / cmdline. Как я могу увеличить этот лимит?
Решение
Вы не можете изменить это динамически, ограничение жестко запрограммировано в ядре на 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>
Я временно обошел ограничение аргумента ps в 4096 символов в командной строке (точнее / proc / PID / cmdline) с помощью небольшого скрипта для замены команды java.
Во время разработки я всегда использую распакованную версию JDK из SUN и никогда не использую установленный JRE или JDK ОС, независимо от того, используется ли Linux или Windows (например, загрузка бина или rpm.bin). Я не рекомендую менять скрипт для вашей установки Java по умолчанию (например, потому что он может прерывать обновления, перезаписываться, создавать проблемы или ...)
Предполагая, что команда java находится в /x/jdks/jdk1.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
затем создайте скрипт /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 $@
а затем сделайте скрипт работоспособным
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.PROCESS_ID.cmdline в конце
После того, как я получил командную строку, я всегда перемещаю скрипт в нечто вроде " java.script " и скопируйте (cp -a) реальный двоичный файл java.orig обратно в java. Я использую сценарий только тогда, когда достигну предела 4K.
Могут быть проблемы с экранированными символами и, возможно, даже пробелами в путях или чем-то подобным, но у меня это хорошо работает.
Вы можете использовать jconsole
, чтобы получить доступ к исходной командной строке без ограничений по длине.
Можно использовать более новые дистрибутивы Linux, где этот предел был удален, например, RHEL 6.8 или новее
" Ограничение длины файла / proc / pid / cmdline для команды ps ранее было жестко задано в ядре до 4096 символов. Это обновление гарантирует, что длина / proc / pid / cmdline не ограничена, что особенно полезно для перечисления процессов с длинными аргументами командной строки. (BZ # 1100069) & Quot;
Для программ на Java, где вы просто заинтересованы в проверке аргументов командной строки, полученных вашим основным классом, вы можете запустить:
jps -m
Я совершенно уверен, что если вы на самом деле видите аргументы, усеченные в / proc / $ pid / cmdline, то вы фактически превышаете максимальную длину аргумента, поддерживаемую ОС. Насколько я могу судить, в Linux размер ограничен размером страницы памяти. См. " ps ww " ограничение длины для справки.
Единственный способ обойти это - перекомпилировать ядро. Если вы хотите зайти так далеко, чтобы решить эту проблему, вам может пригодиться этот пост: " Список аргументов слишком долго " ;: Вне аргументов и ограничений
Дополнительная ссылка:
ARG_MAX, максимальная длина аргументов для нового процесса
Возможно, вам нужен параметр w для ps. Добавьте два «w» для большего выхода. Он говорит ps игнорировать ширину линии терминала.