Como capturar o PID de um processo no Linux com ps, grep e awk

Em ambientes de administração de sistemas Linux e automação via Shell Script, é uma tarefa rotineira identificar o identificador de processo (PID) de uma aplicação em execução para monitoramento ou encerramento. Uma das sequências de comandos mais utilizadas para essa finalidade é a combinação de ps, grep e awk.

Abaixo, detalhamos o funcionamento de cada componente da expressão ps -ef | grep [termo] | grep -v grep | awk '{print $2}'.

1. Filtragem sleetiva com grep -v

O comando ps -ef lista todos os processos ativos no sistema. Ao encadear um grep para buscar um serviço específico, o próprio comando de busca acaba aparecendo nos resultados, pois ele contém a string pesquisada em sua linha de comando.

# Exemplo de busca sem filtragem do grep
$ ps -ef | grep api-backend.jar
root      4500     1  0 10:00 ?        00:01:20 java -jar api-backend.jar
root      4567  4520  0 10:05 pts/0    00:00:00 grep --color=auto api-backend.jar

Para evitar que o PID do próprio grep seja retornado, utilizamos o parâmetro -v (invert-match), que instrui o comando a exibir apenas as linhas que não contêm o padrão especificado.

# Removendo o próprio grep do resultado
$ ps -ef | grep api-backend.jar | grep -v grep
root      4500     1  0 10:00 ?        00:01:20 java -jar api-backend.jar

2. Extração de colunas com awk

O awk é uma ferramenta poedrosa para processamento de texto baseada em colunas. Por padrão, ele utiliza espaços em branco como delimitadores. Na saída do comando ps -ef, a segunda coluna corresponde ao PID do processo.

Ao utilizarmos awk '{print $2}', estamos isolando apenas o valor numérico que identifica o processo:

$ ps -ef | grep api-backend.jar | grep -v grep | awk '{print $2}'
4500

Nesse contexto:

  • $0: Representaria a linha inteira.
  • $1: Representaria o usuário dono do processo.
  • $2: Representa o PID (objetivo principal).

3. Aplicação prática em Scripts

Esta lógica é frequentemente encapsulada em funções de verificação de status para garantir que apenas instâncias válidas da aplicação sejam detectadas.

#!/bin/bash

# Nome da aplicação a ser monitorada
APP_TARGET="servico-email"

verificar_execucao() {
    # Captura o PID ignorando o processo do grep
    identificador=$(ps -ef | grep "$APP_TARGET" | grep -v grep | awk '{print $2}')
    
    if [ -z "$identificador" ]; then
        echo "O serviço $APP_TARGET não está rodando."
        return 1
    else
        echo "Serviço $APP_TARGET localizado sob o PID: $identificador"
        return 0
    fi
}

verificar_execucao

Embora existam ferramentas dedicadas como o pgrep, compreender a estrutura de pipes entre grep e awk é fundamental para criar filtros customizados onde é necessário anlaisar múltiplos campos da tabela de processos simultaneamente.

Tags: Linux Bash shell-script grep awk

Publicado em 10-10 04:58