ps печатает только до 4096 символов командной строки любого процесса


19

Когда я выполняю grep для процесса Java, я получаю вывод ниже, но он ограничен 4096 символами, что приводит к тому, что фактическое имя процесса (то есть kafka.Kafka) не отображается в grepвыводе.

Это ограничение grep? Можно ли печатать символы за пределами 4096?

ps -ef | grep java

java -Xmx6G -Xms6G -server -XX: + UseG1GC -XX: MaxGCPauseMillis = 20 -XX: InitiatingHeapOccupancyPercent = 35 -XX: + DisableExplicitGC -Djava.awt.headless = true -Xloggc: / x / kafka / data01 -logs / kafkaServer-gc.log -verbose: gc -XX: + PrintGCDetails -XX: + PrintGCDateStamps -XX: + PrintGCTimeStamps -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate = false -Dcom. sun.management.jmxremote.ssl = false -Dkafka.logs.dir = / x / kafka / data01 / kafka-app-logs -Dlog4j.configuration = файл: ./../ config / log4j.properties -cp: / x /home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/aopalliance-repackaged-2.4.0-b34.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10 -0.10.1.1 / бен /../ ЛИЭС / argparse4j-0.5.0.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / Connect-API- 0.10.1.1.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/ ../libs/connect-file-0.10.1.1.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/connect-json-0.10.1.1.jar:/ х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / Connect-среда-0.10.1.1.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10- 0.10.1.1/bin/../libs/guava-18.0.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/hk2-api-2.4.0 -b34.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / hk2-локатор-2.4.0-b34.jar: / х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / hk2-Utils-2.4.0-b34.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/ бен /../ ЛИЭС / ДЖЕКСОН-аннотаций-2.6.0.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / ДЖЕКСОН-ядро-2.6.3 .jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / ДЖЕКСОНА-DataBind-2.6.3.jar: / х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен / ../libs/jackson-jaxrs-base-2.6.3.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jackson-jaxrs-json-provider-2.6 .3.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / ДЖЕКСОНА-модуль-JAXB-аннотаций-2.6.3.jar: / х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / Javassist-3.18.2-GA.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/ бен /../ ЛИЭС / javax.annotation-апи-1.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / javax.inject-1.jar : /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / 2.4.0-javax.inject, b34.jar: / х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / javax.servlet-апи-3.1.0.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/ .. /libs/javax.ws.rs-api-2.0.1.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jersey-client-2.22.2 .jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jersey-common-2.22.2.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10 -0.10.1.1 / бен /../ ЛИЭС / Джерси-контейнер-сервлет-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / Джерси-контейнер-сервлет-ядро-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / Джерси-гуава-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jersey-media-jaxb-2.22.2.jar:/x/home/bmcuser/kafka-paypal/kafka_2 .10-0.10.1.1 / бен /../ ЛИЭС / Джерси-сервера 2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-продолжающей 9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-HTTP-9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jetty-io-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jetty-security-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2 .10-0.10.1.1 / бен /../ ЛИЭС / причал-сервера 9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-сервлет-9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-сервлеты-9.2.15.v20160210. баночка: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-Util-9.2.15.v20160210.jar: / х / дома / bmcuser / Кафка-PayPal /kafka_2.10-0.10.1.1/bin/../libs/jopt-simple-4.9.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/ kafka_2.10-0.10.1.1.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / kafka_2.10-0.10.1.1-так/libs/jetty-server-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jetty-servlet-9.2.15.v20160210 .jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-сервлеты-9.2.15.v20160210.jar: / х / дома / bmcuser / kafka- PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / причал-Util-9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/ ../libs/jopt-simple-4.9.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/kafka_2.10-0.10.1.1.jar:/ х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / kafka_2.10-0.10.1.1-так/libs/jetty-server-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jetty-servlet-9.2.15.v20160210 .jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ ЛИЭС / причал-сервлеты-9.2.15.v20160210.jar: / х / дома / bmcuser / kafka- PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / причал-Util-9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/ ../libs/jopt-simple-4.9.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/kafka_2.10-0.10.1.1.jar:/ х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / kafka_2.10-0.10.1.1-так/libs/jetty-util-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jopt-simple-4.9.jar:/ х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / kafka_2.10-0.10.1.1.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10- 0.10.1.1/bin/../libs/kafka_2.10-0.10.1.1-so/libs/jetty-util-9.2.15.v20160210.jar:/x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin/../libs/jopt-simple-4.9.jar:/ х / дома / bmcuser / Кафка-PayPal / kafka_2.10-0.10.1.1 / бен /../ ЛИЭС / kafka_2.10-0.10.1.1.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10- 0.10.1.1/bin/../libs/kafka_2.10-0.10.1.1-so


Можете ли вы сослаться на этот пост. unix.stackexchange.com/questions/101681/…
Камарадж

Это не решило проблему. Я предполагаю, что ограничение здесь составляет 4096 байт.
zer0Id0l

3
Похоже, что вы могли бы сделать ваш путь к классам намного короче, используя подстановочный синтаксис, см. Stackoverflow.com/questions/219585/… , или вы определенно можете полностью удалить его из командной строки, используя env var CLASSPATH; у любого из них есть хороший шанс сделать командную строку достаточно короткой, чтобы увидеть ваше имя класса. Или для Java обрабатывает только , если ваш идентификатор имеет доступ , и вы имеете или получите JDK, jpsпоказывает Classname независимо от командной строки усечения (по крайней мере , на Linux).
dave_thompson_085

1
@slebetman Я уверен, что OP знает, но сценарий, который, вероятно, сгенерировал это не так
cat

1
Название подразумевает, что ps -efпечатает больше, но grep - это то, что его меняет. Это кажется ... необоснованным.
Чарльз Даффи

Ответы:


35

Это не ограничение grep, но /proc/PID/cmdline(технически, проектное решение, а не ограничение). /proc/PID/cmdlineсодержит полную командную строку процесса с основной командой и аргументами, разделенными NUL ASCII, и файл также заканчивается NUL. Таким образом, grepбудет напечатано все содержимое файла, если есть совпадение. ( ps -efполучает содержимое этого файла как CMD).

Максимальная длина жестко задана в ядре (Linux) дляPAGE_SIZE :

static int proc_pid_cmdline(struct task_struct *task, char * buffer)
{
        int res = 0;
        unsigned int len;
        struct mm_struct *mm = get_task_mm(task);
        if (!mm)
                goto out;
        if (!mm->arg_end)
                goto out_mm;    /* Shh! No looking before we're done */

        len = mm->arg_end - mm->arg_start;

        if (len > PAGE_SIZE)
                len = PAGE_SIZE;

следовательно, 4096 байт для такой системы:

% getconf PAGE_SIZE
4096

Кроме того, если у вас есть многобайтовые символы, количество символов будет меньше 4096, как вы можете себе представить.


7
@ zer0Id0l Вы не можете изменить PAGE_SIZE: это свойство оборудования. Вам нужно спроектировать какое-то новое оборудование с большим размером страницы или (что намного проще…) снять ограничение на то, что содержимое cmdlineусекается до одной страницы, путем правильного отображения или копирования памяти.
Жиль "ТАК - перестань быть злым"

4
FWIW, когда Джайлс говорит, что это свойство аппаратного обеспечения, он имеет в виду, что это свойство MMU вашего процессора. Таким образом, вам нужно использовать процессор с MMU размером страницы более 4k или разработать архитектуру (и построить для нее материнскую плату + BIOS), в которой используется внешний MMU с размером страницы более 4k (помните, в прошлом MMU раньше был внешний чип) или создайте свой собственный процессор (плюс компилятор и т. д.). Другой вариант - изменить ядро ​​Linux, чтобы proc_pid_cmdlineоно не использовало PAGE_SIZE
slebetman

Это ограничение дизайна не должно существовать. Не стесняйтесь написать еще один proc_pid_cmdline, у которого его нет.
Джошуа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.