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. ¿Qué es el PID de un proceso en GNU/Linux?
Es el ID del proceso.
2. ¿Qué diferencia hay entre la opción
-a
y la opción-x
de la ordenps
?-a
Muestra los procesos que están asociados al terminal, y-x
los que están en segundo plano.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. Listar todos los archivos que contengan la cadena ".jpg" dentro de la estructura de directorios del sistema. Usar la orden
ls
ygrep
.ls -R / | grep "\.jpg"
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. 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 procesols
. Con la ordenrenice
otorgar la máxima prioridad a la ordenls
. Después con la ordenkill
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. Visualizar mediante el editor
vi
el archivo que contiene la información de los usuarios del sistema. Ejecutar el programavi
con la máxima prioridad posible.sudo nice -n -20 vi /etc/passwd
8. En otro terminal, obtener el PID del editor
vi
y el PID de su proceso padre mediante la ordenpstree
.pstree -p | grep vi
9. Mediante la orden
top
establecer una prioridad normal al editorvi
y después terminar el proceso del editor.En
top
pulsar
para editar, presionar0
y enter; Y para terminar el procesoK
.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. Listar todos los archivos terminados en
.gif
del sistema de directorios del sistema y almacenarlo en el archivotodoslosgif
.find / -name "*.gif" > todoslosgif &
Ejecutar esta orden en segundo plano.
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. 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. 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. 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. ¿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 comandofg
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. Indica dos maneras para que un proceso detenido, continúe en 2º plano.
1º Ejecutar
firefox
y luego ponerlo en pausa con el comandokillall -19 firefox
y luego enviamos el proceso a segundo plano conbg
.2º Con el comando
&
se manda directamente a segundo plano.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 comandojobs
para ver si se está ejecutando en segundo plano y ya para ver el PID se lanza el comandops aux | grep firefox
que en este caso el PID es 1369419. 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. 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. 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. 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