Extrai os parâmetros do tomcat da saída do ps

5

Estou tentando escrever uma pequena ferramenta de diagnóstico e uma das funções que quero dela é que eu quero executar:

ps axu | grep tomcat | grep -v grep | awk '{ print $<list of desired fields> }'  

Eu quero retornar o userid que iniciou o tomcat e os seguintes parâmetros que foram passados quando o tomcat foi iniciado:

-javaagent:/usr/share/tomcat7/<someagent> -Dcatalina.base=/var/lib/tomcat7 
- Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp

Eu quero que esses campos sejam passados para uma matriz que eu possa usar para informar ao usuário algo sobre a instalação do tomcat.

O problema é que não consigo encontrar uma maneira de formatar o comando para forçar os campos a serem o que eu preciso que eles façam para fazer o awk funcionar.

Neste ponto, estou pensando em apenas pegar a saída, gravá-la em um arquivo temporário e, em seguida, puxar o que quero usando regex.

Eu sei que há uma maneira de fazer isso no Bash, mas eu não tive nenhum sucesso em chegar aqui.

    
por Adrienne Davis 11.08.2014 / 00:49

2 respostas

3

Passe a opção -o para ps para controlar os campos que ela gera. Se você adicionar um sinal = após todos os campos, a linha de cabeçalho será omitida.

Use -e em vez de ax para manter os recursos padrão (isso trabalhar em qualquer unix não antigo).

Seu filtro com grep não é robusto. Por exemplo, se você executar esse comando a partir de um script chamado look-for-tomcat , seu script também será correspondido. Aqui está uma maneira mais robusta que procura por um processo da JVM com org.apache.catalina.startup.Bootstrap como argumento.

ps -e -o user=,args= | awk '
    $2 ~ /java$/ &&  / org\.apache\.catalina\.startup\.Bootstrap($| ) {
        print "user name: ", $1;
        if (match($0, / -javaagent:[^ ]* /)) print substr($0, RSTART+1, RSTART+RLENGTH-2);
        # etc.
    }'

Melhor ainda seria registrar o PID do processo do tomcat em um arquivo (por exemplo, /var/run/tomcat.pid ) quando for iniciado.

    
por 11.08.2014 / 01:03
0

Se você tem /proc em seu sabor particular de * nix, você pode tentar persuadir os dados que você quer com isso. Eu acho que isso pode ser um pouco mais saudável do que tentar percorrer o tédio da análise de saída que é destinada a um ser humano ler.

Por exemplo, para obter o ID do usuário que iniciou o processo tomcat , você pode fazer:

stat -c'%u' /proc/$(pgrep tomcat)/

Basear-se na disponibilidade (e padronização) de /proc pode ser ainda mais complicado, dependendo da sua aplicação / ambiente / ... Cabe a você decidir, eu acho.

    
por 11.08.2014 / 01:02