Exercício – encerrar um processo com comportamento inadequado
Computadores são imperfeitos. Cedo ou tarde, algo vai dar errado. É por isso que você tem um trabalho como administrador do sistema; cabe a você solucionar problemas do sistema.
Imagine que um aplicativo Python está causando problemas. Talvez esteja ocupando muito tempo de CPU ou tenha parado de responder. Em ambos os casos, você deseja parar o aplicativo. Para identificar um processo ou aplicativo, você pode usar ps
e grep
. Em seguida, para interrompê-lo, você pode usar o comando kill
. Vamos praticar isso em sua máquina virtual Linux.
Iniciar um processo de comportamento inadequado
Se você for encerrar um processo, precisará de um processo para eliminar. Vamos criar um.
Volte para sua base inicial digitando o seguinte comando:
cd ~
Em Azure Cloud Shell, digite o seguinte comando para iniciar o editor
vi
do Linux:vi bad.py
vi
é um editor de texto amplamente usado que o Linux herdou do UNIX. Gostando ou não, um usuário Bash precisa conhecer as noções básicas dovi
.Selecione a tecla i para colocar
vi
no modo de inserção. Em seguida, digite o seguinte programa Python:i = 0 while i == 0: pass
Esse programa é executado em um loop infinito – claramente não é algo que você queira executar em seu servidor.
Selecione a tecla Esc para sair do modo de inserção. Em seguida, digite o seguinte comando seguido pela tecla Enter para salvar o programa e sair
vi
::wq
Inclua os dois-pontos no início do comando. Para o restante do comando,
w
significa "write" (gravar, em inglês) eq
significa "quit" (sair).Agora, use o seguinte comando para iniciar o programa e deixá-lo em execução em segundo plano:
python3 bad.py &
Inclua o e comercial (
&
) no final do comando. Caso contrário, você não retornará ao prompt do Bash. No Bash, o e comercial executa um comando e retorna para a linha de comando, mesmo que o comando não tenha terminado a execução.
Não é óbvio, mas bad.py está agora em execução em segundo plano e roubando ciclos de CPU de outros processos. Vamos examinar o que está acontecendo.
Encerrar o processo
Para encerrar um processo, você precisa do nome ou da ID do processo. Este é um trabalho para ps
.
Para atualizar a memória, um comando
ps -ef
lista todos os processos em execução e exibe uma grande quantidade de informações sobre cada um. Use o seguinte comando para listar todos os processos em execução e filtrar os resultados em linhas que contenham "Python":ps -ef | grep python
Os resultados devem ser semelhantes a:
yourname+ 342 254 99 23:34 pts/1 00:00:31 python3 bad.py yourname+ 344 254 0 23:35 pts/1 00:00:00 grep --color=auto python
Na lista, parece que bad.py está consumindo 99% do tempo de CPU do servidor. O programa está fazendo jus ao nome.
O comando
kill
interrompe um processo em execução com base em sua ID de processo. (Um comando relacionado chamadokillall
encerra um processo com base no nome do processo.) Ao chamarkill
, você precisa decidir que tipo de "sinal" usar para encerrar o processo. Use o seguinte comando para exibir uma lista de tipos de sinais:kill -l
Se você estivesse encerrando um processo de daemon — executado em segundo plano e que fornece serviços vitais para o sistema operacional —, talvez quisesse encerrá-lo e reiniciá-lo imediatamente. Para fazer isso, você pode usar um sinal de
SIGHUP
.Neste exemplo, você deseja encerrar o processo sem reiniciá-lo. Portanto, você deseja usar o sinal de
SIGKILL
, que corresponde ao número 9. Para esse fim, pegue a ID do processo bad.py da saída dops -ef
(ela está na segunda coluna) e use o comando a seguir para encerrar o processo. SubstituaPROCESS_ID
pela ID do processo.kill -9 PROCESS_ID
O mesmo comando também pode ser inserido como
kill -s SIGKILL PROCESS_ID
. Fica a seu critério usar o nome ou o número de um sinal.Termine executando
ps
novamente para confirmar que bad.py não está mais em execução.
Outro uso comum para ps
e kill
é identificar e encerrar "processos zumbis", que são processos filho deixados para trás por programas mal escritos.