ps imprime apenas até 4096 caracteres da linha de comando de qualquer processo

19

Quando eu grep para um processo java, fico abaixo da saída, mas é limitado a 4096 caracteres, o que resulta no nome do processo real (que é kafka.Kafka) não mostrado na grepsaída.

Isso é uma limitação do grep? Existe alguma maneira de imprimir caracteres além do limite 4096?

ps -ef | grep java

java -Xmx6G -Xms6G -server -XX: + UseG1GC -XX: MaxGCPauseMillis = 20 -XX: InitiationHeapOccupancyPercent = 35 -XX: + DisableExplicitGC -Djava.awt.headless = true -Xloggc: / x / kafka / data01 / kafka-app -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 = arquivo: ./../ 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 / bin /../ libs / argparse4j-0.5.0.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / 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:/ x / home / bmcuser / kafka-paypal / kafka_2.10-0.10.1.1 / bin /../ libs / connect-runtime-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 /../ libs / hk2-locator-2.4.0-b34.jar: / x / home / bmcuser / kafka-paypal / kafka_2.10-0.10.1.1 / bin /../ libs / hk2-utils-2.4.0-b34.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/ bin /../ libs / jackson-annotations-2.6.0.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jackson-core-2.6.3 .jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jackson-databind-2.6.3.jar: / x / home / bmcuser / kafka-paypal / kafka_2.10-0.10.1.1 / bin / ../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 /../ libs / jackson-module-jaxb-annotations-2.6.3.jar: / x / home / bmcuser / kafka-paypal / kafka_2.10-0.10.1.1 / bin /../ libs / javassist-3.18.2-GA.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/ bin /../ libs / javax.annotation-api-1.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / javax.inject-1.jar : /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / javax.inject-2.4.0-b34.jar: / x / home / bmcuser / kafka-paypal / kafka_2.10-0.10.1.1 / bin /../ libs / javax.servlet-api-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 / bin /../ libs / jersey-container-servlet-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jersey-container-servlet-core-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jersey-guava-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 / bin /../ libs / jersey-server-2.22.2.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jetty-continuation-9.2.15.v20160210.jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ libs / jetty-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 / bin /../ 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 /../ libs / jetty-servlets-9.2.15.v20160210. jar: /x/home/bmcuser/kafka-paypal/kafka_2.10-0.10.1.1/bin /../ 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:/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 /../ libs / kafka_2.10-0.10.1.1-so/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 /../ libs / jetty-servlets-9.2.15.v20160210.jar: / x / home / bmcuser / kafka- paypal / kafka_2.10-0.10.1.1 / bin /../ 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:/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 /../ libs / kafka_2.10-0.10.1.1-so/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 /../ libs / jetty-servlets-9.2.15.v20160210.jar: / x / home / bmcuser / kafka- paypal / kafka_2.10-0.10.1.1 / bin /../ 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:/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 /../ 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:/ 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/../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:/ 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/../libs/kafka_2.10-0.10.1.1-so

zer0Id0l
fonte
você pode consultar este post. unix.stackexchange.com/questions/101681/…
Kamaraj
Isso não resolveu o problema. Eu acho que a limitação aqui é 4096 bytes.
Zer0Id0l
3
Parece que você provavelmente poderia tornar seu caminho de classe muito mais curto usando a sintaxe curinga, consulte stackoverflow.com/questions/219585/… , ou você pode definitivamente movê-lo (totalmente) para fora da linha de comando usando env var CLASSPATH; qualquer um deles tem uma boa chance de tornar a linha de comando curta o suficiente para ver seu nome de classe. Ou para Java processa única , se o seu UID tem acesso e você tem ou obter JDK, jpsmostra classname independentemente da truncagem de linha de comando (pelo menos no Linux).
Dave_thompson_085
1
@slebetman Tenho certeza OP está ciente, mas o script que provavelmente gerou este não é
cat
1
O título implica que ps -efimprime mais, mas grep é o que está mudando. Isso parece ... infundado.
Charles Duffy

Respostas:

35

Isso não é uma limitação grep, mas de /proc/PID/cmdline(tecnicamente, uma decisão de design, não uma limitação). /proc/PID/cmdlinecontém a linha de comando completa do processo, com o comando principal e os argumentos separados por ASCII NUL, e o arquivo termina em NUL também. Portanto, grepimprimirá todo o conteúdo do arquivo, se houver uma correspondência. ( ps -efobtém o conteúdo deste arquivo como CMD).

O comprimento máximo é codificado no kernel (Linux) paraPAGE_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;

daqui 4096 bytes para tal sistema:

% getconf PAGE_SIZE
4096

Além disso, se você tiver caracteres multibyte, o número de caracteres seria menor que 4096, como você pode imaginar.

heemail
fonte
7
@ zer0Id0l Você não pode mudar PAGE_SIZE: é uma propriedade do hardware. Você precisaria projetar um novo hardware com um tamanho de página maior ou (muito mais fácil ...) remover a limitação de que o conteúdo cmdlineé truncado para uma página implementando o mapeamento ou cópia de memória adequada.
Gilles 'SO- stop be evil'
4
FWIW, quando Giles diz que é uma propriedade do hardware, ele quer dizer que é propriedade da MMU da sua CPU. Portanto, você precisa usar uma CPU com MMU de tamanho de página maior que 4k ou projetar uma arquitetura (e construir uma placa-mãe + BIOS para isso) que use MMU externa com tamanho de página maior que 4k (lembre-se, no passado, a MMU costumava ser uma chip externo) ou crie sua própria CPU (além de compilador, etc.). A outra opção é modificar o kernel linux para que proc_pid_cmdlinenão usa PAGE_SIZE
slebetman
Essa limitação de design não precisa existir. Sinta-se livre para escrever outro proc_pid_cmdline que não o possua.
197 Joshua Joshua