Opciones avanzadas de terminación de procesos
En este paso, exploraremos algunas opciones avanzadas del comando pkill que permiten una gestión de procesos más sofisticada.
Uso de Diferentes Tipos de Señales
Por defecto, pkill envía la señal SIGTERM (señal 15) a los procesos. Esta señal permite que los procesos terminen de forma controlada (gracefully), cerrando archivos y realizando operaciones de limpieza. Sin embargo, hay casos en los que es posible que desees utilizar una señal diferente.
Creemos un script que maneje señales:
cd ~/project
nano signal_handler.sh
Añade el siguiente contenido al script:
#!/bin/bash
trap 'echo "Received SIGHUP (1)"; exit 0' SIGHUP
trap 'echo "Received SIGINT (2)"; exit 0' SIGINT
trap 'echo "Received SIGTERM (15)"; exit 0' SIGTERM
echo "Process started with PID $$"
echo "Use: pkill -[signal] -f signal_handler.sh to send signals"
while true; do
sleep 1
done
Haz el script ejecutable:
chmod +x ~/project/signal_handler.sh
Ejecuta el script en segundo plano:
~/project/signal_handler.sh &
Ahora, intentemos enviar diferentes señales al proceso:
- Envía una señal SIGHUP (señal 1):
pkill -HUP -f signal_handler.sh
- Inicia el script de nuevo y envía SIGINT (señal 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- Inicia el script de nuevo y envía la señal por defecto SIGTERM (señal 15):
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM
Para cada señal, deberías ver el mensaje correspondiente en la salida de la terminal antes de que el proceso termine.
Terminación de Procesos por Antigüedad
pkill te permite seleccionar procesos basándose en su antigüedad utilizando la opción --newest, que selecciona los procesos iniciados más recientemente.
Creemos algunos procesos con diferentes tiempos de inicio:
cd ~/project
nano age_test.sh
Añade el siguiente contenido al script:
#!/bin/bash
while true; do
echo "Process running with PID $$"
sleep 5
done
Haz el script ejecutable:
chmod +x ~/project/age_test.sh
Inicia el primer proceso:
~/project/age_test.sh &
Espera unos segundos, luego inicia dos procesos más:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Ahora, terminemos solo los dos procesos iniciados más recientemente usando la opción --newest:
pkill -f --newest 2 age_test.sh
Verifica qué procesos siguen ejecutándose:
ps aux | grep age_test.sh
Solo deberías ver el primer proceso todavía en ejecución, ya que se inició antes que los otros dos procesos.
Termina el proceso restante:
pkill -f age_test.sh
Limitando pkill por Propietario del Proceso
También puedes limitar las acciones de pkill a los procesos propiedad de un usuario específico. En un sistema multiusuario, esto es particularmente útil.
A modo de demostración, ejecutemos algunos procesos como el usuario actual:
~/project/rogue_app.sh &
~/project/rogue_app.sh &
Ahora, terminemos estos procesos, pero solo aquellos propiedad de tu usuario actual:
pkill -f -u $(whoami) rogue_app.sh
La opción -u especifica el nombre de usuario del propietario del proceso. La sustitución de comandos $(whoami) obtiene tu nombre de usuario actual.
Verifica que todos los procesos hayan sido terminados:
ps aux | grep rogue_app.sh
Solo deberías ver el comando grep en la salida.
Esta capacidad de seleccionar procesos por propietario es especialmente útil en entornos multiusuario donde deseas evitar afectar a los procesos que pertenecen a otros usuarios.