Exercício – Terminar um processo que está a funcionar incorretamente

Concluído

Os computadores são imperfeitos. Mais cedo ou mais tarde, algo vai correr mal. É por isso que tem o cargo de administrador de sistema. Cabe-lhe a si resolver problemas no sistema.

Imagine que uma aplicação Python está a causar problemas. Talvez esteja ocupando muito tempo da CPU, ou talvez tenha parado de responder. Em qualquer dos casos, pretende parar a aplicação. Para identificar um processo ou uma aplicação, pode utilizar os comandos ps e grep. Em seguida, para o parar, pode utilizar o comando kill. Pratiquemos isto na sua máquina virtual Linux.

Iniciar um processo com funcionamento incorreto

Se vai eliminar um processo, precisa de um processo para o fazer. Vamos criar um.

  1. Regresse ao seu diretório raiz ao escrever o seguinte comando:

    cd ~
    
  2. No Azure Cloud Shell, introduza o seguinte comando para iniciar o editor vi do Linux:

    vi bad.py
    

    O vi é um editor de texto amplamente utilizado que o Linux herdou do Unix. Quer goste ou não, um utilizador do Bash tem de ter noções básicas do vi.

  3. Selecione a tecla i para colocar o vi no modo de inserção. Em seguida, escreva o seguinte programa Python:

    i = 0
    while i == 0:
        pass
    

    Quando executado, este programa funciona num ciclo infinito, algo que decididamente não quer no seu servidor.

  4. Selecione a tecla Esc para sair do modo de inserção. Depois, escreva o seguinte comando e selecione a tecla Enter para guardar o programa e sair vi:

    :wq
    

    Certifique-se de que inclui dois pontos no início do comando. Quanto ao resto do comando, w significa "escrever" e q significa "sair".

  5. Agora, utilize o seguinte comando para iniciar o programa e deixá-lo a funcionar em segundo plano:

    python3 bad.py &
    

    Certifique-se de que inclui o "e" comercial (&) no fim do comando. Caso contrário, não voltará à linha de comandos do Bash. No Bash, o "e" comercial executa um comando e faz regressar à linha de comandos, mesmo que a execução do comando não tenha terminado.

Embora não seja óbvio, bad.py está agora a ser executado em segundo plano e a desviar ciclos de CPU de outros processos. Vejamos o que está a acontecer mais de perto.

Eliminar o processo

Para eliminar um processo, precisa do nome do processo ou do ID de processo. Esta é uma tarefa para o comando ps.

  1. Para refrescar a sua memória, um comando ps -ef apresenta todos os processos em execução e uma grande quantidade de informações sobre cada um. Utilize o seguinte comando para apresentar todos os processos em execução e filtrar os resultados para linhas que contenham "python":

    ps -ef | grep python
    

    Os resultados deverão ser semelhantes ao seguinte:

    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 listagem, bad.py parece estar a consumir 99% do tempo de CPU do servidor. O programa faz jus ao seu nome.

    O comando kill elimina um processo em execução com base no respetivo ID de processo. (Um comando relacionado chamado killall mata um processo com base no nome do processo.) Quando você liga kill, você tem que decidir que tipo de "sinal" usar para matar o processo. Utilize o seguinte comando para apresentar uma lista de tipos de sinais:

    kill -l
    
  3. Se estivesse a eliminar um processo de daemon, que é executado em segundo plano e fornece serviços vitais ao sistema operativo, talvez quisesse eliminar e reiniciá-lo de imediato. Para o fazer, poderia utilizar o sinal SIGHUP.

    Neste exemplo, quer eliminar o processo sem o reiniciar. Por conseguinte, deve utilizar o sinal SIGKILL, que corresponde ao número 9. Para tal, obtenha o ID de processo de bad.py da saída de ps -ef (encontra-se na segunda coluna) e utilize o seguinte comando para terminar o processo. Substitua PROCESS_ID pelo ID de processo.

    kill -9 PROCESS_ID
    

    O mesmo comando também pode ser introduzido como kill -s SIGKILL PROCESS_ID. Pode escolher utilizar o nome ou o número de um sinal.

  4. Para finalizar, execute novamente o comando ps para confirmar que bad.py já não está a ser executado.

Outra utilização comum dos comandos ps e kill é identificar e terminar "processos zombie", ou seja, processos subordinados deixados para trás por programas mal escritos.