Вопрос

Для моих приложений 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;

https: // access. redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/6.8_Release_Notes/new_features_kernel.html

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

jps -m

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

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

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

Возможно, вам нужен параметр w для ps. Добавьте два «w» для большего выхода. Он говорит ps игнорировать ширину линии терминала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top