Exercício – encerrar um processo com comportamento inadequado

Concluído

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.

  1. Volte para sua base inicial digitando o seguinte comando:

    cd ~
    
  2. 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 do vi.

  3. 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.

  4. 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) e q significa "quit" (sair).

  5. 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.

  1. 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
    
  2. 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 chamado killall encerra um processo com base no nome do processo.) Ao chamar kill, 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
    
  3. 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 do ps -ef (ela está na segunda coluna) e use o comando a seguir para encerrar o processo. Substitua PROCESS_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.

  4. 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.