Gestión de Procesos en Linux: Ejercicios Prácticos y Scripts

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 14,33 KB

#!/bin/bash

# Solicitar al usuario el nombre de un programa en ejecución

read -p "Introduce el nombre del programa en ejecución: " programa

# Obtener los PIDs del programa usando pidof

pids=$(pidof "$programa")

# Verificar si se encontraron PIDs

if [ -z "$pids" ]; then

    echo "Error: El programa '$programa' no está en ejecución."

    exit 1

fi

# Si hay varios PIDs, quedarse con el último

pid=$(echo "$pids" | awk '{print $NF}')

echo "El PID del proceso seleccionado es: $pid"

# Solicitar al usuario un número de señal

while true; do

    read -p "Introduce un número de señal (1-64): " senal

    # Verificar que la señal esté en el rango válido

    if [[ "$senal" =~ ^[0-9]+$ ]] && [ "$senal" -ge 1 ] && [ "$senal" -le 64 ]; then

        break

    else

        echo "Error: La señal debe ser un número entre 1 y 64."

    fi

done

# Enviar la señal al proceso

kill -"$senal" "$pid"

# Verificar si el proceso ha finalizado

if kill -0 "$pid" 2>/dev/null; then

    echo "El proceso con PID $pid aún está en ejecución."

else

    echo "El proceso con PID $pid ha finalizado."

fi

# Listar los procesos en ejecución

echo "Listando los procesos en ejecución:"

ps aux

# Comprobar que el proceso ya no aparece en la lista

if ! ps -p "$pid" > /dev/null 2>&1; then

    echo "El proceso con PID $pid ya no está en la lista de procesos en ejecución."

else

    echo "El proceso con PID $pid todavía está en la lista de procesos en ejecución."

fi


#!/bin/bash

# Función para ejecutar un proceso con una prioridad específica
ejecutar_con_prioridad() {
    read -p "Introduce el nombre del programa que deseas ejecutar: " programa
    while true; do
        read -p "Introduce el valor de nice (entre -20 y 19): " nice_value
        if [[ "$nice_value" =~ ^-?[0-9]+$ ]] && [ "$nice_value" -ge -20 ] && [ "$nice_value" -le 19 ]; then
            break
        else
            echo "Error: El valor de nice debe estar entre -20 y 19."
        fi
    done

    echo "Ejecutando '$programa' con nice $nice_value..."
    nice -n "$nice_value" "$programa" &
    pid=$!
    echo "El proceso '$programa' se ha ejecutado con PID $pid y nice $nice_value."
}

# Función para modificar la prioridad de un proceso en ejecución
modificar_prioridad() {
    echo "Mostrando lista de procesos activos..."
    top -b -n 1 | head -20
    # Alternativa: ps -eo pid,comm,ni --sort=ni | head -20

    read -p "Introduce el PID del proceso al que deseas cambiar la prioridad: " pid
    while true; do
        read -p "Introduce el nuevo valor de nice (entre -20 y 19): " nice_value
        if [[ "$nice_value" =~ ^-?[0-9]+$ ]] && [ "$nice_value" -ge -20 ] && [ "$nice_value" -le 19 ]; then
            break
        else
            echo "Error: El valor de nice debe estar entre -20 y 19."
        fi
    done

    echo "Modificando la prioridad del proceso con PID $pid a nice $nice_value..."
    renice "$nice_value" -p "$pid"
    if [ $? -eq 0 ]; then
        echo "La prioridad del proceso con PID $pid ha sido modificada a nice $nice_value."
    else
        echo "Error: No se pudo modificar la prioridad del proceso."
    fi
}

# Función para verificar y monitorear los procesos
verificar_y_monitorear() {
    echo "Mostrando lista de procesos activos..."
    top -b -n 1 | head -20
    # Alternativa: ps -eo pid,comm,ni --sort=ni | head -20

    read -p "¿Deseas ejecutar top en tiempo real para visualizar los cambios? (s/n): " respuesta
    if [[ "$respuesta" =~ ^[Ss]$ ]]; then
        top
    fi
}

# Menú principal
while true; do
    echo "1. Ejecutar un proceso con una prioridad específica"
    echo "2. Modificar la prioridad de un proceso en ejecución"
    echo "3. Verificar y monitorear los procesos"
    echo "4. Salir"
    read -p "Selecciona una opción (1-4): " opcion

    case "$opcion" in
        1)
            ejecutar_con_prioridad
            ;;
        2)
            modificar_prioridad
            ;;
        3)
            verificar_y_monitorear
            ;;
        4)
            echo "Saliendo del script..."
            exit 0
            ;;
        *)
            echo "Opción no válida. Por favor, selecciona una opción del 1 al 4."
            ;;
    esac
done


Ejercicios PROCESOS

Preguntas sobre Procesos en GNU/Linux

  1. 1. ¿Qué es el PID de un proceso en GNU/Linux?

    Es el ID del proceso.

  2. 2. ¿Qué diferencia hay entre la opción -a y la opción -x de la orden ps?

    -a Muestra los procesos que están asociados al terminal, y -x los que están en segundo plano.

  3. 3. ¿Qué es el número NICE de un proceso? ¿Qué valores puede tomar el parámetro NICE? ¿Qué usuarios pueden cambiar este parámetro?

    Determina la prioridad de la CPU de un proceso en el sistema; cuanto más bajo, mayor prioridad.

    Valores posibles: de -20 (mayor prioridad) a 19 (menor prioridad).

    El valor de nice puede ser modificado por un usuario normal.

  4. 4. Listar todos los archivos que contengan la cadena ".jpg" dentro de la estructura de directorios del sistema. Usar la orden ls y grep.

    ls -R / | grep "\.jpg"

  5. 5. Ejecutar otra vez la orden anterior, pero esta vez con la prioridad más baja posible.

    nice -n 19 ls -R / | grep "\.jpg"

  6. 6. Abrir otro terminal, y mientras la orden anterior se ejecuta, mediante la orden ps listar todos los procesos asociados al terminal del usuario actual y obtener el PID del proceso ls. Con la orden renice otorgar la máxima prioridad a la orden ls. Después con la orden kill terminar el proceso de la manera “más correcta” posible.

    nice -n 19 ls -R / | grep "\.jpg" &

    ps aux | grep “ls”

    renice -20 <PID>

    kill <PID>

  7. 7. Visualizar mediante el editor vi el archivo que contiene la información de los usuarios del sistema. Ejecutar el programa vi con la máxima prioridad posible.

    sudo nice -n -20 vi /etc/passwd

  8. 8. En otro terminal, obtener el PID del editor vi y el PID de su proceso padre mediante la orden pstree.

    pstree -p | grep vi

  9. 9. Mediante la orden top establecer una prioridad normal al editor vi y después terminar el proceso del editor.

    En top pulsa r para editar, presionar 0 y enter; Y para terminar el proceso K.

  10. 10. Ejecutar el navegador WEB mozilla desde el terminal en segundo plano. Indicar el número de trabajo y su PID.

    firefox & jobs -l

    jobs

    grep top

  11. 11. Listar todos los archivos terminados en .gif del sistema de directorios del sistema y almacenarlo en el archivo todoslosgif.

    find / -name "*.gif" > todoslosgif &

    Ejecutar esta orden en segundo plano.

  12. 12. Mediante la orden jobs listar todos los trabajos en segundo plano del terminal.

    Sleep 777 & (ejecuta la orden en segundo plano 1)

    Sleep 777 & (ejecuta la orden en segundo plano 2)

    Sleep 777 & (ejecuta la orden en segundo plano 3)

    Sleep 777 & (ejecuta la orden en segundo plano 4)

  13. 13. Mirar los procesos existentes en el sistema y lanzar un proceso que dure 600 segundos en 1º plano (p.e. sleep 600)

    sleep 600

    top

    Para consultar los procesos en 2º plano (ps -aux | grep sleep)

  14. 14. Mata el proceso ¿Qué observamos? ¿Aparecen los mismos procesos que al principio?

    ps aux | grep sleep

    kill <PID>

    ps aux | grep sleep podemos observar que hemos matado uno de todos los procesos.

  15. 15. Repetimos el 13 y el 14, pero ahora sólo queremos detener el proceso (no cancelarlo). ¿Qué observamos? ¿Aparecen los mismos procesos que al principio?

    Stop opción 19 de kill

    par ver las opciones de kill -l

  16. 16. ¿Cómo podemos hacer para que continúe el proceso en 1º plano? ¿Se puede hacer con la orden kill?

    No se puede hacer con el comando kill porque no se usa para mover un proceso al primer plano, sino para enviar señales a los procesos. Se utilizaría el comando fg que si que serviría para mover un proceso al primer plano.

    El comando some_process & sirve para ejecutar un proceso en segundo plano y así no bloquear la terminal y cuando se añade un & al final sirve para seguir usando la terminal para otros comandos mientras el proceso se está ejecutando en segundo plano.

  17. 17. Indica dos maneras para que un proceso detenido, continúe en 2º plano.

    1º Ejecutar firefox y luego ponerlo en pausa con el comando killall -19 firefox y luego enviamos el proceso a segundo plano con bg.

    2º Con el comando & se manda directamente a segundo plano.

  18. 18. Lanzar un proceso en 2º plano y obtener su PID. ¿Cuál es su número de trabajo y nº de proceso?

    1º Lanzar firefox & en segundo plano y ya de ahí lanzar el comando jobs para ver si se está ejecutando en segundo plano y ya para ver el PID se lanza el comando ps aux | grep firefox que en este caso el PID es 13694

  19. 19. Si un proceso lanzado en 2º plano termina su ejecución, ¿seguirá apareciendo en la salida de jobs? Razona tu respuesta.

    No, cuando un proceso está en segundo plano termina desaparece de la salida del jobs

Scripts de Administración de Procesos

  1. 1. Modifica el siguiente script para mande la señal 9 (SIGKILL) al proceso que encuentra.

    #!/bin/bash
    echo "Obtenemos el PID"
    PID_AUX=$(ps -e | grep firefox | cut -d " " -f2)
    echo "- PID: $PID_AUX"
    # Enviar la señal SIGKILL (9) al proceso
    kill -9 $PID_AUX
    if [ $? -eq 0 ]; then
       echo "Señal SIGKILL enviada correctamente al proceso con PID $PID_AUX."
    else
       echo "Error: No se pudo enviar la señal SIGKILL al proceso."
    fi
    exit 0
  2. 2. Modifica el siguiente script para que muestre los PIDS de los procesos en el árbol que muestra pstree.

    #!/bin/bash
    echo "Obtenemos el PID"
    PID_AUX=$(ps -e | grep firefox | cut -d " " -f2)
    echo "- PID: $PID_AUX"
    # Mostrar el árbol de procesos con PIDs
    echo "Árbol de procesos para el PID $PID_AUX:"
    pstree -p $PID_AUX
    exit 0
  3. 3. Modifica el siguiente script para que lance un proceso que se le pide al usuario (mediante entrada estándar) con prioridad 10.

    #!/bin/bash
    # Solicitar al usuario el nombre del proceso
    echo -n "Indique el proceso que desea ejecutar: "
    read PROCESO
    # Ejecutar el proceso con prioridad 10
    nice -n 10 $PROCESO &
    # Mostrar el PID del proceso lanzado
    PID=$!
    echo "El proceso '$PROCESO' se ha ejecutado en segundo plano con PID $PID y prioridad 10."
    exit 0

Entradas relacionadas: