como obter os argumentos completos da linha de comando passados para um processo em sistemas unix / linux? [duplicado]

3

Estou procurando uma maneira confiável de obter todos os argumentos de linha de comando passados para um processo, mesmo quando eles são muito longos .

Eu sei sobre ps -f -p <pid> e /proc/<pid>/cmdline , os quais geralmente estão à altura do trabalho. O problema é que ambos parecem truncar os argumentos de linha de comando em 4096 caracteres, e eu sei que este é mais longo (é um aplicativo java e a saída trunca no meio da string de caminho de classe), e xargs --show-limits me diz que meu sistema permite até 2094184 de comprimento de argumento.

Existe uma maneira de fazer isso?

ATUALIZAÇÃO: Consegui obter a cadeia de argumentos completa da linha de comando, criando um wrapper que coloquei anteriormente no PATH e registrei os argumentos em um arquivo antes de chamar o binário correto com os mesmos argumentos.

#!/bin/bash

file=/tmp/commandtrap-$$.log

/usr/bin/echo "$@" >$file
/usr/lib/jvm/java-7-openjdk/jre/bin/java "$@"

Esta é, no entanto, uma solução feia que só funciona porque eu poderia parar e executar o processo.

Idealmente, deve haver uma maneira de obter o comando completo sem a necessidade de fechar o processo em execução (ou perturbá-lo de qualquer forma)

    
por Chikitulfo 03.04.2015 / 18:50

1 resposta

3

Eu não acredito que haja uma maneira em geral. Pode haver algum sistema operacional específico. Você disse Unix / Linux, mas talvez você esteja interessado em uma solução para um sistema operacional em particular?

Como exemplo, o Solaris armazena o argumento de processos em dois locais. Um é um buffer imutável no kernel associado ao processo. Mas como é um buffer de kernel, o tamanho é limitado e pode ser uma versão truncada da linha de comando.

O outro local é ARGV [] no próprio processo. Isso pode ser consultado (como por meio de pargs ) e retornará o conteúdo não-truncado. Mas como o ARGV faz parte da memória do processo, ele pode ser modificado a qualquer momento. O conteúdo pode não ser o mesmo que a linha de comando que iniciou o processo.

Um usuário posterior não pode ter a garantia de encontrar a linha de comando original.

Acabei de encontrar a resposta de Stéphane Chazelas para um problema semelhante aqui: ps: full o comando é muito longo

Ele parece incluir um método que tenta decodificar ARGV [] em binários ELF x86, mas não consegui obter dados dele em um caso de teste. Não sei porquê. Mas a técnica parece razoável.

    
por 03.04.2015 / 19:14