Tutorial de Linux / Consultar, suspender, retomar e encerrar processos

Para gerenciar processos no Linux, identifique o programa, examine seu estado e uso de recursos e só envie um sinal quando precisar intervir. O ps mostra uma fotografia dos processos; o top atualiza a visualização. Para encerrar um processo, prefira o mecanismo de encerramento do programa ou um pedido com TERM; reserve KILL, que não pode ser tratado pelo processo, para quando as medidas apropriadas anteriores falharem.

Esta aula pratica consulta de estado, controle de tarefas do shell e sinais. Reparentalização, processos zumbis e namespaces de PID são explicados na aula de PID e PPID. Os comandos de consulta pressupõem Linux com as ferramentas procps/procps-ng; implementações mínimas ou camadas de compatibilidade podem oferecer outras opções.

Distinguir processos, tarefas do shell e serviços

Um processo é uma instância de um programa em execução. O PID (process ID) o identifica no contexto observado; o PPID (parent process ID) identifica seu pai atual, que pode mudar. Uma tarefa, ou job, é uma unidade acompanhada por um shell e pode reunir mais de um processo, como em um pipeline. Um identificador como %1 pertence ao controle de tarefas daquele shell; não é um PID válido como identidade global permanente.

Alguns processos pertencem a serviços, mas nem todo processo é um serviço. Antes de encerrar um processo individual de um serviço, examine o estado e os registros pelo gerenciador responsável. Ele pode reiniciar o processo ou administrar outros processos relacionados. Aqui, a prática fica limitada a um processo criado pela sua própria conta para o exercício.

Escolher as colunas necessárias com ps

O ps consulta os processos no momento da execução; a lista não fica congelada depois de exibida. As colunas abaixo permitem comparar PID, pai, usuário, estado, tempo decorrido e linha de comando. -e seleciona todos os processos visíveis nesse ambiente e -o define os campos. Quando souber o alvo, reduza o alcance da consulta ao PID adequado.

ps -eo pid,ppid,user,stat,etime,args
ps -eo pid,ppid,user,%cpu,%mem,stat,args --sort=-%cpu | head

O segundo comando ordena pelo valor de CPU informado, do maior para o menor, e head limita a saída às primeiras dez linhas por padrão, incluindo o cabeçalho. No ps do procps, %CPU relaciona o tempo de CPU acumulado ao tempo de vida do processo; não é simplesmente o consumo no último instante. %MEM relaciona a memória residente à memória física. Não deduza a causa de uma lentidão a partir de uma única fotografia nem compare percentuais de ferramentas diferentes sem entender a medição.

O primeiro caractere de STAT indica o estado principal: R, executando ou pronto para executar; S, espera interrompível; D, espera não interrompível, frequentemente de entrada e saída; T, execução suspensa; e Z, processo encerrado cujo resultado ainda não foi recolhido pelo pai. Caracteres adicionais descrevem outros atributos. O campo ETIME é tempo decorrido desde o início, diferente do tempo efetivamente gasto na CPU.

Observar mudanças com top e procurar candidatos com pgrep

O top atualiza periodicamente a lista e os valores de uso de recursos. A ordenação, o intervalo e os campos dependem da configuração. Use q para sair. Observe vários ciclos e os registros relacionados para distinguir atividade persistente de um pico breve; não confunda espera com erro apenas por um processo não estar em R.

top

O pgrep procura processos por nome; -a acrescenta a linha de comando à saída. Neste exemplo, sleep é uma expressão de busca no nome, não uma garantia de correspondência exata nem uma pesquisa automática em todos os argumentos:

pgrep -a sleep

Para exigir o nome exato, a opção -x pode ser usada como em pgrep -a -x sleep, mas vários processos ainda podem ter esse nome. Confirme usuário, comando e contexto antes de agir. Um alvo pode terminar logo após a consulta, e seu PID pode ser reutilizado. Não copie todos os números de uma busca para um comando de encerramento.

Sem correspondências, pgrep normalmente retorna estado 1; isso não equivale a um erro de sintaxe, que retorna 2. Examine também mensagens de erro e limitações de visibilidade. Para a prática com seu próprio processo, capturar o PID no shell é mais claro do que selecionar apenas pelo nome.

Suspender e retomar seu próprio processo

Execute a prática em um Bash interativo no Linux, mantendo o mesmo shell até concluir. sleep 300 & inicia uma espera de 300 segundos em segundo plano; capture $! imediatamente, antes de iniciar outra tarefa em segundo plano. Neste exemplo simples, ele fornece o PID do sleep. O texto practice PID: apenas identifica a saída; o número varia a cada execução.

Execute uma linha de cada vez. Na primeira consulta com ps, confirme que o PID é positivo, corresponde ao seu sleep 300 recém-criado e tem o proprietário e o pai esperados. Se a criação ou a consulta falhar, pare e verifique a causa antes dos comandos kill. Não use outro processo, um número antigo, um PID de outro usuário ou um serviço em produção como substituto.

sleep 300 &
practice_pid=$!
printf 'practice PID: %s\n' "$practice_pid"
ps -p "$practice_pid" -o pid,ppid,stat,etime,args
kill -STOP "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args
kill -CONT "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

Depois de STOP, o estado costuma começar com T; após CONT, pode voltar a S ou a outro estado. A entrega do sinal e a observação não são uma operação atômica: confirme o estado e não trate uma linha isolada como uma sequência garantida de resultados. STOP suspende a execução sem encerrar o processo; CONT a retoma. No Linux, STOP, assim como KILL, não pode ser capturado, bloqueado ou ignorado pelo programa.

A suspensão mantém o processo e seus recursos, podendo reter arquivos abertos e bloqueios. Por isso, não é um método de encerramento nem uma intervenção inofensiva em serviços. Depois da observação, retome o processo de prática com CONT antes de pedir sua saída. Se os 300 segundos já tiverem passado, confirme novamente a identidade em vez de reutilizar a variável como se fosse uma referência permanente.

Pedir o encerramento com TERM e verificar o resultado

Conclua no mesmo shell, com o sleep de prática retomado e ainda identificado. TERM pede o encerramento: um programa com um tratador adequado pode fazer a limpeza, mas o sinal não garante que isso aconteça. O comportamento padrão é terminar o processo. O wait do Bash aguarda um filho desse shell e recolhe seu estado; não é uma espera genérica por qualquer PID da máquina.

kill -TERM "$practice_pid"
wait "$practice_pid"
ps -p "$practice_pid" -o pid,stat,args

Se o filho terminou por um sinal, wait retorna um estado maior que 128 no Bash. Isso é diferente de a tarefa ter concluído normalmente com estado 0. Consulte $? imediatamente após wait, se precisar registrar o resultado; outro comando o substitui. Estas linhas são uma prática interativa: em um script com set -e, um retorno não zero pode interromper a execução antes da consulta final. Com controle de tarefas ativo, wait sem -f também pode retornar quando o filho muda de estado, sem ter terminado. Não confunda uma suspensão com encerramento; quando precisar aguardar a terminação mesmo nesse caso, o Bash oferece wait -f.

Se o último ps mostrar apenas o cabeçalho e indicar ausência do PID, normalmente o processo de prática já terminou. Examine o estado de saída e eventuais erros: uma falha de consulta não prova, por si só, que houve encerramento. Se houver uma linha, confirme a identidade outra vez, pois um número reutilizado pode corresponder a outro processo. Se o programa tratar ou ignorar TERM, aguarde conforme seu funcionamento e investigue o estado e os registros; wait pode continuar bloqueado enquanto o filho existir.

kill -KILL PID, com o PID real de um alvo confirmado, não dá ao programa a oportunidade de tratar o sinal ou finalizar suas próprias gravações. Pode deixar dados da aplicação inconsistentes. Considere-o somente quando a identidade, as consequências e a falha do encerramento apropriado estiverem claras. Uma tarefa em D pode não desaparecer imediatamente mesmo após esse sinal: investigue a espera de entrada e saída. Este exercício não precisa de KILL.

A autorização para enviar sinais depende das credenciais e dos privilégios envolvidos, conforme kill(2); não se deve presumir que qualquer PID visível possa ser controlado. Para esta prática, use somente o filho recém-criado pela sua conta e sem sudo. O retorno de sucesso de kill não comprova que o alvo terminou: confirme o resultado separadamente.

Entender primeiro e segundo plano no shell

No Bash, comando & inicia uma tarefa em segundo plano; jobs -l lista as tarefas e os PIDs acompanhados pelo shell atual. A lista não inclui todas as tarefas de outros terminais nem todos os processos do sistema. Depois de a tarefa terminar e ser recolhida, ela pode deixar de aparecer nessa lista.

jobs -l

Com controle de tarefas ativo em um terminal interativo, Ctrl+Z normalmente envia o sinal de suspensão TSTP ao grupo de primeiro plano. Ele difere do STOP usado acima: o programa pode tratar ou ignorar TSTP. Se a tarefa for suspensa, bg %1 a retoma em segundo plano e fg %1 a traz ao primeiro plano. Escolha o número real mostrado por jobs; %1 é apenas um exemplo. Em um shell sem controle de tarefas ativo, fg e bg não oferecem essa mesma operação.

Uma tarefa em segundo plano continua sujeita à sessão, aos sinais e à entrada e saída do terminal; tentar ler do terminal pode suspendê-la. Acrescentar & não a transforma em um serviço confiável que sobreviva ao logout. Para um servidor que exija supervisão contínua, use o mecanismo de serviços adequado ao ambiente. A aula de gerenciamento de unidades com systemctl explica o caso de sistemas que usam systemd.

Como investigar um processo problemático?

  1. Confirme PID, comando, proprietário e pai com ps ou pgrep. Restrinja a busca e considere o contexto de PID; um nome parecido não identifica o alvo com segurança.
  2. Observe vários ciclos do top e os registros relacionados. Distinga uso persistente de CPU ou memória, espera normal e uma falha concreta.
  3. Verifique se o processo pertence a um serviço. Consulte o estado e os registros pelo gerenciador antes de manipular um filho isolado.
  4. Quando um processo seu precisar terminar, use seu mecanismo apropriado de saída ou solicite TERM. Dê tempo à limpeza prevista e escolha uma intervenção adicional somente depois de avaliar a causa e o alvo.
  5. Consulte novamente o resultado e investigue reinícios, recorrência e a causa original. Revalide a identidade: a consulta anterior e uma ação posterior não formam uma operação atômica.

Fontes primárias

Os manuais ps(1), top(1) e pgrep(1) explicam os campos, as medições e as opções de busca. Consulte kill(1) para o comando, kill(2) para autorização e signal(7) para o comportamento dos sinais. O manual do GNU Bash descreve os comandos internos de controle de tarefas e wait e os fundamentos de tarefas em primeiro e segundo plano.