Domine o Comando `ps` no Linux: Gerencie e Monitore Processos com Eficiência

Tenha uma visão detalhada dos processos que estão rodando no seu sistema Linux utilizando o comando ps. Este comando oferece a capacidade de localizar processos específicos por nome, usuário ou até mesmo pelo terminal, apresentando desde informações básicas até os detalhes mais aprofundados, conforme sua necessidade.

Gerenciamento de Processos no Ambiente Linux

O núcleo, ou kernel, é o componente fundamental de qualquer sistema operacional Linux e sistemas semelhantes ao Unix. Ele desempenha um papel essencial na alocação de recursos do sistema, como memória RAM e tempo de CPU. Essa alocação acontece em tempo real, assegurando que todos os processos em execução recebam sua parte dos recursos, com base na prioridade de cada um.

Ocasionalmente, as tarefas podem apresentar travamentos, entrar em loops infinitos ou simplesmente parar de responder. Em outros casos, elas podem continuar em execução, mas utilizando excessivamente recursos como CPU ou RAM, ou apresentando um comportamento indesejado. Nesses momentos, torna-se necessário encerrar esses processos. O primeiro passo para isso é identificar o processo problemático.

Mas, pode ser que você não tenha problemas com suas tarefas ou desempenho. Talvez você esteja apenas curioso para saber quais processos estão ativos em seu sistema, e queira ter uma visão do que está acontecendo “por baixo do capô”. O comando ps atende tanto à necessidade de monitorar problemas quanto à curiosidade, apresentando um retrato do que está ocorrendo no seu sistema.

O ps se destaca por sua flexibilidade, permitindo que você obtenha exatamente as informações desejadas, no formato mais adequado. Ele oferece uma vasta gama de opções, mas as que abordaremos aqui são suficientes para atender às necessidades mais comuns. Caso queira se aprofundar em suas funcionalidades, este artigo servirá como uma introdução que facilitará a compreensão do manual do comando.

Listando Processos Ativos

A forma mais simples de usar o ps é executá-lo sem nenhum parâmetro:

ps

Ao fazer isso, o ps exibirá uma lista dos processos iniciados pelo usuário que executou o comando. A saída apresentará quatro colunas:

  • PID: O número de identificação do processo.
  • TTY: O nome do terminal onde o usuário está logado.
  • TEMPO: A quantidade de tempo de CPU que o processo utilizou.
  • CMD: O nome do comando que iniciou o processo.

Listando Processos de Todos os Usuários

Ao adicionar a opção -e (selecionar todos os processos), o comando ps listará os processos de todos os usuários, e não somente os do usuário que executou o comando. Por ser uma lista extensa, adicionamos o comando less para facilitar a visualização:

ps -e | less

A saída do comando é direcionada para o less.

Agora a lista de processos é muito mais longa, mas as colunas exibidas são as mesmas de antes. Os processos que apresentam um ponto de interrogação (?) na coluna TTY são aqueles que não foram iniciados a partir de uma janela de terminal.

Exibindo a Hierarquia de Processos

Em algumas situações, visualizar quais processos deram origem a outros processos pode ser útil para identificar problemas ou encontrar um processo específico. Para isso, podemos usar a opção -H (hierarquia):

ps -eH | less

O recuo na saída indica a relação pai-filho entre os processos.

Para facilitar a visualização da hierarquia, podemos utilizar a opção --forest, que adiciona caracteres ASCII para desenhar a hierarquia como uma árvore:

ps -eH --forest | less

Dessa forma, fica mais claro quais processos são pais de outros processos.

Listando Processos por Nome

Para listar processos que tenham um nome específico, podemos usar o grep para filtrar a saída do ps. Por exemplo, para encontrar processos que tenham “firefox” no nome:

ps -e | grep firefox

Neste exemplo, a saída mostra apenas uma entrada, que é o processo que estávamos procurando. Se tivéssemos várias instâncias do Firefox rodando, haveria mais de uma entrada na lista.

Apresentando Mais Colunas na Saída

Para exibir mais informações sobre os processos, utilize a opção -f (formato completo):

ps -ef | less

Agora, a saída do ps inclui um conjunto extra de colunas.

As colunas apresentadas são:

  • UID: O ID do usuário proprietário do processo.
  • PID: O ID do processo.
  • PPID: O ID do processo pai.
  • C: O número de filhos do processo.
  • STIME: A hora de início do processo.
  • TTY: O nome do terminal onde o usuário está logado.
  • TEMPO: O tempo total de CPU utilizado pelo processo.
  • CMD: O nome do comando que iniciou o processo.

Usando a opção -F (formato completo extra), podemos obter ainda mais colunas:

ps -eF | less

Desta vez, a saída incluirá tantas colunas que será necessário rolar a tela horizontalmente para visualizá-las completamente.

Pressionando a tecla “Seta para a direita”, você pode mover a exibição para a esquerda, mostrando o restante das colunas.

As colunas adicionais são:

  • UID: O ID do usuário proprietário do processo.
  • PID: O ID do processo.
  • PPID: O ID do processo pai.
  • C: O número de filhos do processo.
  • SZ: O tamanho da imagem do processo em páginas RAM.
  • RSS: O tamanho do conjunto residente, que é a memória física não trocada que o processo utiliza.
  • PSR: O processador ao qual o processo está atribuído.
  • STIME: A hora de início do processo.
  • TTY: O nome do terminal onde o usuário está logado.
  • TEMPO: O tempo total de CPU utilizado pelo processo.
  • CMD: O nome do comando que iniciou o processo.

Listando Processos por ID de Processo

Após encontrar o ID de um processo específico, você pode usá-lo com o comando ps para ver seus detalhes. Utilize a opção -p (selecionar por ID de processo):

ps -p 3403

A saída mostrará os detalhes do processo especificado.

Você não precisa limitar a busca a apenas um ID. É possível fornecer uma lista de IDs separados por espaços.

Listando Processos por Comando

A opção -C (comando) permite pesquisar um processo usando o nome do comando que o iniciou. Este é diferente da linha de comando, que pode incluir o caminho e opções. Por exemplo, para procurar pelo processo do programa “shutter”:

ps -C shutter

Os detalhes do processo do Shutter serão exibidos.

Listando Processos de um Usuário

Para visualizar os processos de um usuário específico, utilize a opção -u (lista de usuários):

ps -u mary

A lista de processos pertencentes à conta do usuário “mary” será apresentada.

Listando Processos por Terminal

Para listar os processos associados a um terminal (TTY), use a opção -t (selecionar por TTY). Ao utilizar essa opção sem um número TTY, ela exibirá os processos associados à janela do terminal atual.

tty
ps -t

O comando tty mostra que este é o pseudo-teletipo 0. Os processos listados pelo comando ps -t estão todos associados ao TTY pts/0.

Se fornecermos um número TTY específico na linha de comando, obteremos um relatório dos processos associados a ele:

ps -t 1

Neste caso, os processos estão todos associados ao TTY pts/1.

Selecionando as Colunas a Serem Exibidas

A opção -o (formato) permite selecionar quais colunas você quer exibir na saída do ps. Você deve especificar as colunas pelo nome. Uma lista completa dos nomes das colunas pode ser encontrada na seção “Especificadores de formato padrão” do manual do comando. Neste exemplo, selecionamos o tempo de CPU (pcpu) e a linha de comando com argumentos (args):

ps -e -o pcpu,args | less

A saída exibirá apenas as duas colunas solicitadas.

Ordenando a Saída por Colunas

Com a opção --sort, é possível ordenar a saída por uma coluna específica. Vamos ordenar a saída pela coluna de CPU:

ps -e -o pcpu,args --sort -pcpu| less

O hífen (-) no parâmetro pcpu especifica que a ordem de classificação será decrescente.

Para ver os 10 processos que mais consomem CPU, podemos direcionar a saída para o comando head:

ps -e -o pcpu,args --sort -pcpu | head -10

A saída é truncada e ordenada de acordo com o uso de CPU.

Podemos ordenar por várias colunas, adicionando a coluna pmem (porcentagem de memória utilizada), por exemplo. Sem o hífen ou com um sinal de mais (+), a ordenação será crescente:

ps -e -o pcpu,pmem,args --sort -pcpu,pmem | head -10

A nova coluna é incluída na saída e utilizada para ordenar os processos. A primeira coluna (pcpu) é utilizada para ordenar em ordem decrescente, e a segunda coluna (pmem) é utilizada para ordenar em ordem crescente.

Para tornar a saída mais útil, vamos adicionar a coluna de ID do processo (pid):

ps -e -o pid,pcpu,pmem,args --sort -pcpu,pmem | head -10

Agora podemos identificar cada um dos processos listados.

Finalizando Processos Usando o ID

Agora que já aprendemos a identificar processos por nome, comando, usuário, terminal e atributos como uso de CPU e memória, podemos usar o ID do processo para encerrá-los usando o comando kill. Por exemplo, para finalizar o processo 898:

sudo kill 898

Se tudo correr bem, o processo será encerrado silenciosamente.

Finalizando Processos por Nome

O comando pkill permite finalizar processos utilizando o nome. Certifique-se de que está finalizando o processo correto! Por exemplo, para finalizar o processo “top”:

sudo pkill top

Novamente, o silêncio na resposta do comando indica que o processo foi finalizado corretamente.

Finalizando Múltiplos Processos por Nome

Se você tem várias cópias de um mesmo processo em execução, ou se um processo iniciou vários processos filhos (como o Google Chrome), como você pode encerrá-los? É simples! Use o comando killall:

Por exemplo, temos duas cópias do processo “top” em execução:

ps -e | grep top

Podemos encerrá-los utilizando o seguinte comando:

sudo killall top

Como o comando não retornou nenhuma mensagem de erro, os dois processos foram encerrados.

Obtendo uma Visão Dinâmica com o Comando top

A saída do comando ps é um retrato estático dos processos no momento da sua execução. Para obter uma visão atualizada, utilize o comando top. Ele oferece uma visão dinâmica dos processos em execução no seu sistema. A tela é dividida em duas partes: um painel de texto no topo da tela e uma tabela com colunas na parte inferior.

Para iniciar o top, utilize:

top

As colunas contêm as seguintes informações sobre os processos:

  • PID: ID do processo.
  • USUÁRIO: Nome do usuário proprietário do processo.
  • PR: Prioridade do processo.
  • NI: O valor nice do processo.
  • VIRT: Memória virtual usada pelo processo.
  • RES: Memória residente usada pelo processo.
  • SHR: Memória compartilhada usada pelo processo.
  • S: Status do processo. Consulte a lista abaixo para os valores possíveis.
  • %CPU: Porcentagem do tempo de CPU utilizada pelo processo desde a última atualização.
  • %MEM: Porcentagem da memória física utilizada.
  • TIME+: Tempo total de CPU utilizado pela tarefa em centésimos de segundo.
  • COMANDO: Nome do comando ou linha de comando (parâmetros e opções). Se não for possível visualizar a coluna do comando, pressione a tecla “Seta para a direita”.

O status do processo pode ter os seguintes valores:

  • D: Sono ininterrupto.
  • R: Rodando.
  • S: Dormindo.
  • T: Rastreando (parado).
  • Z: Zumbi.

Pressione a tecla “Q” para sair do top.

Antes de Finalizar um Processo

Antes de finalizar um processo, certifique-se de que ele é realmente o que você deseja, e que finalizar o processo não causará nenhum problema. Em particular, é uma boa ideia utilizar as opções -H (hierarquia) e --forest para verificar se há algum processo filho importante que você pode ter esquecido.