Для моих приложений Java с очень длинными путями к классам я не вижу основной класс, указанный в конце списка аргументов при использовании ps. Я думаю, это связано с ограничением размера моей системы Ubuntu на / proc / pid / cmdline. Как я могу увеличить этот лимит?
Как увеличить ограничение в 4096 байт / 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>
jps
увидеть полный путь к классам java-процессов hadoop ... по какой-то причине jps
даже не покажет мне путь к классам!
- person ernesto; 17.08.2014
jps -lvm
для меня даже лучше - m
необходим для отображения аргументов командной строки (не аргументов JVM), переданных вашему main
методу Java.
- person javabrett; 27.10.2017
Я временно обхожу ограничение аргумента командной строки в 4096 символов для ps (или, скорее, / proc / PID / cmdline), используя небольшой скрипт для замены команды java.
Во время разработки я всегда использую распакованную версию JDK от SUN и никогда не использую установленную JRE или JDK ОС, независимо от того, Linux или Windows (например, загрузите bin вместо 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 сценария оболочки. Я думаю, что есть также некоторое ограничение оболочки на количество аргументов командной строки, не могу вспомнить, но, возможно, это было 64 КБ символов.
вы можете изменить сценарий, чтобы удалить текст командной строки из /tmp/java.PROCESS_ID.cmdline в конце
После того, как я получил командную строку, я всегда перемещаю сценарий во что-то вроде "java.script" и копирую (cp -a) фактический двоичный файл java.orig обратно в java. Я использую скрипт только тогда, когда достигаю предела 4K.
Могут быть проблемы с экранированными символами и, возможно, даже с пробелами в путях или чем-то подобным, но у меня это отлично работает.
CLASSPATH
только для этой конкретной команды или разделить необходимые пути между CLASSPATH
и командной строкой.
- person We Are All Monica; 14.10.2009
Вы можете использовать jconsole
, чтобы получить доступ к исходной командной строке без ограничений по длине.
Можно использовать более новые дистрибутивы Linux, где это ограничение было снято, например RHEL 6.8 или новее.
"Предел длины файла / proc / pid / cmdline для команды ps был ранее жестко задан в ядре и составлял 4096 символов. Это обновление гарантирует, что длина / proc / pid / cmdline не ограничена, что особенно полезно для перечисления процессов с длинными аргументами командной строки. (BZ # 1100069) "
Для программ на основе Java, в которых вы просто заинтересованы в проверке аргументов командной строки, полученных вашим основным классом, вы можете запустить:
jps -m
Я почти уверен, что если вы действительно видите усеченные аргументы в / proc / $ pid / cmdline, значит, вы на самом деле превышаете максимальную длину аргумента, поддерживаемую ОС. Насколько я могу судить, в Linux размер ограничен размером страницы памяти. См. ограничение длины ps ww для справки.
Единственный способ обойти это - перекомпилировать ядро. Если вы хотите зайти так далеко, чтобы решить эту проблему, вы можете найти этот пост полезным: "Список аргументов тоже long ": помимо аргументов и ограничений
Дополнительная ссылка:
ARG_MAX, максимальная длина аргументов для нового процесса < / а>
getconf ARG_MAX
говорит, что ARG_MAX = 2097152
(это означает, что максимальная длина аргумента составляет 2 мегабайта). Однако /proc/$pid/cmdline
усекается до PAGE_SIZE
, что составляет 4096. Ваша ссылка с инструкциями НЕ охватывает эту конкретную ситуацию - я понятия не имею, вызовет ли изменение соответствующего бита в fs/proc/base.c
другие проблемы.
- person We Are All Monica; 14.10.2009
Возможно, вам нужен параметр w для ps. Добавьте две буквы «w» для большей производительности. Он сообщает ps игнорировать ширину линии терминала.