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