Exercício – Terminar um processo que está a funcionar incorretamente
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.
Regresse ao seu diretório raiz ao escrever o seguinte comando:
cd ~
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 dovi
.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.
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" eq
significa "sair".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
.
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
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 chamadokillall
mata um processo com base no nome do processo.) Quando você ligakill
, 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
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 deps -ef
(encontra-se na segunda coluna) e utilize o seguinte comando para terminar o processo. SubstituaPROCESS_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.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.