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.