Bash: Qué hacer cuando control-c no mata un proceso, debido al hecho de que el script bash contiene un bucle que llama a otro proceso: ¿Existe una solución mejor para el botón de encendido/apagado?

Bash: Qué hacer cuando control-c no mata un proceso, debido al hecho de que el script bash contiene un bucle que llama a otro proceso: ¿Existe una solución mejor para el botón de encendido/apagado?

El título completo de esta pregunta es:

Bash: Qué hacer cuando control-c no mata un proceso, debido al hecho de que el script bash contiene un bucle que llama a otro proceso: ¿Existe una solución mejor para el botón de encendido/apagado?

El título de esta pregunta se explica por sí mismo, pero aquí hay información más detallada:

Tengo un script bash ejecutándose que llama a otro programa. (Ejecuta/ejecuta otro programa).

Este programa es un programa de ajuste de curvas/datos que no se puede interrumpir con CTRL-C. Pero, al leer estocorreo, descubrí que puedo matarlo conCTRL-\

Pensamientos hipotéticos...

Por lo tanto, es posible simplemente presionar el teclado, mantener presionada la tecla CTRL y presionar la \tecla,PERO¿Qué pasa si ayer compraste un teclado mecánico realmente caro y no tienes suficiente dinero para comprar otro teclado barato que estés dispuesto a "machacar" (porque no quieres usar ninguna de esas 10^6 pulsaciones de teclas que tienes? tener antes de que su nuevo y brillante teclado mecánico se desgaste), o alternativamente, no tiene suficiente tiempo para encontrar su viejo teclado en su casa porque su casa estáextremadamentedesordenado (un desorden) o porque hay una emergencia como un incendio en una bandeja de astillas que ocurre simultáneamente...

También considere que un bucle está llamando a este programa de ajuste y tal vez esté ajustando 1000 archivos de datos; presionar la \tecla 1000 veces probablemente lleve mucho tiempo.

Pensamientos hiperespaciales...

O incluso; ¿Qué pasa si cometiste un error en el script bash y en realidad está ejecutando un bucle infinito?

¿Qué puede hacer para detener la ejecución del script principal en esta situación? Podrías desconectar tu computadora, mantener presionado el botón de encendido durante 10 segundos para apagarla o tirarla al fuego del chip-pan para que deje de funcionar, pero estas soluciones parecen insensibles debido a la posible pérdida de datos que puede ocurrir.

En teoría, uno podría ejecutar el monitor del sistema y tal vez salir del proceso bash, pero esto puede ser difícil de encontrar si tiene muchos procesos de este tipo, todos con el mismo nombre... Además, es posible que tenga una computadora de un solo núcleo o una Computadora multinúcleo con, digamos, N núcleos, que ejecuta N procesos y todos intentan utilizar el 100 % de la CPU. O tal vez solo 1 proceso está usando más de los 4 GB de RAM que tiene y por eso su computadora es extremadamente lenta por esa razón... Demasiado lenta al menos para ejecutar el monitor del sistema por ahora. La siguiente mejor opción después de esto es presionar CTRL-ALT-F1 e intentar iniciar sesión como root y encontrar el padre bash infractor usando ps -Athen kill PID... Pero nuevamente, esto puede tomar muchos minutos de su tiempo si su computadora está tan cargada. que está escribiendo continuamente para intercambiar.

SIG TERM ejecutivo cpu_broken.sh; volver a reunirse; pantalla clara; procesos de pensamiento claros; continuar...

¿Existe una solución mejor?

Respuesta1

Básicamente, ejecuta un script que hace que todo sea inaccesible y desea una solución rápida y sencilla para detenerlo. Una alternativa al ciclo de energía es mantener presionada la tecla ( en muchos casos SYSRQes lo mismo que la tecla) y presionar una por una , , , , , . Básicamente, esa es una forma segura de finalizar todos los procesos en ejecución y reiniciar el sistema.PRTSCREISUB

Una alternativa a eso es hacer sudo nano /proc/sysrq-trigger, escribir b, en ese archivo y guardar. El sistema se reiniciará inmediatamente.

Más información: https://en.wikipedia.org/wiki/Magic_SysRq_key

Respuesta2

Necesitas matar a todo el grupo de procesos. El ID del grupo de procesos (PGID) es el PID del proceso que inició el grupo. Para eliminar el grupo de procesos, necesita encontrar el PID del proceso que inició el grupo de procesos, es decir, el script o comando que lo inició todo. La sintaxis es:

kill -- -PGID

Por ejemplo:

kill -- -1234

Aquí 1234 es el PGID (ID de grupo de procesos).

Esto enviará SIGTERM a todos los procesos del grupo de procesos. Para enviar una señal diferente, por ejemplo, SIGKILL (9), haga:

kill -9 -1234

Cómo encontrar el PGID:

Tu puedes hacer:

ps -eo 'pid,ppid,pgid,cmd'

Esto mostrará el PID, PPID (ID de proceso principal), PGID y el nombre del proceso.

Ahora puede utilizar grepcualquier otro método adecuado para encontrar el PGID y luego eliminarlo mediante los métodos mencionados anteriormente.

La razón por la que he creado el comando para mostrar PPID es porque también puedes intentar finalizar el proceso basándose en la coincidencia de PPID de la siguiente manera pkill:

pkill -P PPID

Por ejemplo:

pkill -P 6789

Con este método, necesita encontrar todos los procesos principales (y secundarios) y luego eliminarlos, por lo que, en mi opinión, eliminar todo el árbol de procesos es una mejor manera si desea eliminarlos a todos.

Respuesta3

Por lo general, puede usar top, htopo algo similar para encontrar el proceso y eliminarlo (o si conoce el nombre o PID del proceso, puede hacerlo killall, pkilletc.). Por ejemplo, usando top, puedo seleccionar un script que se ejecuta desde la terminal y eliminarlo presionando k+ Enter:

ingrese la descripción de la imagen aquí

Si eso no funciona, k+ 9+ Enterdebería usar la señal SIGKILL. SIGKILL solicita que el proceso finalice inmediatamente y no espera a que el proceso termine de limpiar los recursos, etc., como lo hace SIGTERM. Ctrl+ Cun proceso solo envía SIGINT para interrumpir el proceso, como lo hace SIGTERM.

Usar la vista de árbol (presione t) en htop también le permite determinar los procesos principales de un script y eliminarlos para asegurarse de que no continúen en bucle.

Ver también:

información relacionada