Ejercicio: Finalización de un proceso con un comportamiento incorrecto

Completado

Los equipos informáticos no son perfectos. Antes o después, algo irá mal. Por ese motivo tiene una tarea como administrador del sistema: depende de usted solucionar y corregir los problemas del sistema.

Imagine que una aplicación Python está causando problemas. Quizás esté tardando demasiado tiempo en la CPU o tal vez deje de responder. En cualquier caso, quiere detener la aplicación. Para identificar un proceso o una aplicación, puede usar ps y grep. Después, para detenerla, puede usar el comando kill. Vamos a practicar esto en la máquina virtual Linux.

Inicio de un proceso con un comportamiento incorrecto

Si va a terminar un proceso, necesita un proceso para terminarlo. A continuación se creará uno.

  1. Escriba el comando siguiente para volver a la base de operaciones:

    cd ~
    
  2. En Azure Cloud Shell, escriba los comandos siguientes para iniciar el editor vi de Linux:

    vi bad.py
    

    vi es un editor de texto ampliamente utilizado que Linux ha heredado de Unix. Le guste o no, un usuario de Bash debe conocer los aspectos básicos de vi.

  3. Presione la tecla i para colocar vi en modo de inserción. Después, escriba el siguiente programa de Python:

    i = 0
    while i == 0:
        pass
    

    Cuando se ejecuta este programa, lo hace en un bucle infinito, que evidentemente no es algo que quiere que se ejecute en el servidor.

  4. Presione la tecla Esc para salir del modo de inserción. Después, escriba el comando siguiente y presione la tecla Entrar para guardar el programa y salir de vi:

    :wq
    

    Asegúrese de incluir los dos puntos al principio del comando. En cuanto al resto del comando, w significa "escribir" y q "salir".

  5. Ahora, use el comando siguiente para iniciar el programa y dejarlo en ejecución en segundo plano:

    python3 bad.py &
    

    Asegúrese de incluir el símbolo de y comercial (&) al final del comando. De lo contrario, no volverá al símbolo del sistema de Bash. En Bash, el símbolo de y comercial ejecuta un comando y vuelve a la línea de comandos, incluso si el comando no ha se terminado de ejecutar.

No es evidente, pero bad.py ahora se ejecuta en segundo plano y roba ciclos de CPU de otros procesos. Se examinará con detalle lo que sucede.

Terminación del proceso

Para terminar un proceso, necesita el nombre o el identificador del proceso. Este es un trabajo para ps.

  1. Para refrescarle la memoria, un comando ps -ef enumera todos los procesos en ejecución y muestra una gran cantidad de información sobre cada uno. Use el comando siguiente para enumerar todos los procesos en ejecución y filtrar los resultados a las líneas que contengan "python":

    ps -ef | grep python
    

    El resultado debe ser similar al siguiente:

    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. En la lista, parece que bad.py consume el 99 % del tiempo de CPU del servidor. El programa hace honor a su nombre.

    El comando kill termina un proceso en ejecución en función de su identificador de proceso. (Un comando relacionado denominado killall termina un proceso en función de su nombre). Cuando llame a kill, tendrá que decidir qué tipo de "señal" usar para terminar el proceso. Use el comando siguiente para mostrar una lista de tipos de señal:

    kill -l
    
  3. Si fuera a terminar un proceso de demonio (el que se ejecuta en segundo plano y proporciona servicios vitales al sistema operativo) es posible que quiera terminarlo y reiniciarlo inmediatamente. Para ello, puede usar una señal SIGHUP.

    En este ejemplo, quiere terminar el proceso sin reiniciarlo. Por tanto, quiere usar la señal SIGKILL, que se corresponde al número 9. Para ello, tome el identificador de proceso de bad.py de la salida de ps -ef (se encuentra en la segunda columna) y use el comando siguiente para terminar el proceso. Reemplace PROCESS_ID por el identificador de proceso.

    kill -9 PROCESS_ID
    

    El mismo comando también se puede escribir como kill -s SIGKILL PROCESS_ID. Puede elegir si usar el nombre o el número de una señal.

  4. Para finalizar, vuelva a ejecutar ps para confirmar que bad.py ya no se ejecuta.

Otro uso común de ps y kill es identificar y finalizar "procesos inertes", que son procesos secundarios que quedan en los programas mal escritos.