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 se terminen de forma elegante, 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
Agregue 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
Haga que el script sea ejecutable:
chmod +x ~/project/signal_handler.sh
Ejecute el script en segundo plano:
~/project/signal_handler.sh &
Ahora, intentemos enviar diferentes señales al proceso:
- Envíe una señal SIGHUP (señal 1):
pkill -HUP -f signal_handler.sh
- Inicie el script nuevamente y envíe SIGINT (señal 2):
~/project/signal_handler.sh &
pkill -INT -f signal_handler.sh
- Inicie el script nuevamente y envíe la señal SIGTERM predeterminada (señal 15):
~/project/signal_handler.sh &
pkill -f signal_handler.sh ## Default is SIGTERM
Para cada señal, debería ver el mensaje correspondiente en la salida del terminal antes de que el proceso salga.
Terminación de procesos por edad
pkill
permite apuntar a procesos según su edad utilizando las opciones --newer
y --older
.
Creemos algunos procesos con diferentes tiempos de inicio:
cd ~/project
nano age_test.sh
Agregue el siguiente contenido al script:
#!/bin/bash
while true; do
echo "Process running with PID $$"
sleep 5
done
Haga que el script sea ejecutable:
chmod +x ~/project/age_test.sh
Inicie el primer proceso y registre el archivo de referencia:
~/project/age_test.sh &
touch ~/project/reference_time
Espere unos segundos y luego inicie dos procesos más:
sleep 5
~/project/age_test.sh &
~/project/age_test.sh &
Ahora, terminemos solo los procesos que se iniciaron después de que se creó el archivo de referencia:
pkill -f --newer ~/project/reference_time age_test.sh
Verifique qué procesos todavía están en ejecución:
ps aux | grep age_test.sh
Debería ver que solo el primer proceso todavía está en ejecución, ya que se inició antes de que se creara el archivo de referencia.
Termine el proceso restante:
pkill -f age_test.sh
Limitación de pkill por propietario del proceso
También puede limitar las acciones de pkill
a los procesos propiedad de un usuario específico. En un sistema multiusuario, esto es especialmente útil.
Con fines demostrativos, ejecutemos algunos procesos como el usuario actual:
~/project/rogue_app.sh &
~/project/rogue_app.sh &
Ahora, terminemos estos procesos, pero solo aquellos propiedad de su 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 su nombre de usuario actual.
Verifique que se hayan terminado todos los procesos:
ps aux | grep rogue_app.sh
Solo debería ver el propio comando grep
en la salida.
Esta capacidad de apuntar a procesos por propietario es especialmente útil en entornos multiusuario donde se desea evitar afectar a los procesos de otros usuarios.