Canalice todos los procesos suspendidos para matarlos.

Canalice todos los procesos suspendidos para matarlos.

Estoy ejecutando un script que debe suspenderse antes de finalizar. La primera vez que lo ejecuto solo hay un pid para el proceso. Lo mato y ejecuto nuevamente y la cantidad de PID aumenta. En primer lugar, ¿por qué este comportamiento? ¿Y cómo puedo eliminar todos los procesos suspendidos sin mencionar explícitamente cada PID?

./toplog.sh

Suspensión:

Ctrl-Z

Listado de procesos suspendidos:

jobs -l

Producción:

[1]  12055 Stopped                 ./toplog.sh
[2]  12752 Stopped                 ./toplog.sh
[3]- 13276 Stopped                 ./toplog.sh
[4]+ 13579 Stopped                 ./toplog.sh

Asesinato:

kill 12055 12752 13276 13579

Respuesta1

Estoy ejecutando un script que debe suspenderse antes de finalizar.

UH no. No es necesario suspender un script antes de matarlo. Puedes matarlo en cualquier momento.

La primera vez que lo ejecuto solo hay un pid para el proceso. Lo mato y ejecuto nuevamente y la cantidad de PID aumenta.

¡Entonces en realidad no lo estás matando! Si lo ejecuta ./toplog.shy lo suspende, eso solo crea un único trabajo, es decir, una sola línea en la salida de jobs. El script en sí puede crear múltiples procesos, pero jobssolo enumera el script en sí (el líder del grupo de procesos, en términos técnicos). Si ve más y más trabajos, eso significa que todavía está viendo los trabajos antiguos que intentó eliminar sin éxito.

La razón por la que no lograste eliminar los trabajos probablemente sea porque están suspendidos. Cuando un proceso se suspende, no puede reaccionar a las señales. Si envía una señal a un proceso suspendido, la señal solo tiene efecto cuando se reanuda el proceso. Las excepciones son señales que son gestionadas directamente por el núcleo, sin involucrar al proceso. Una de esas excepciones es la señal para reanudar un proceso (SIGCONT), que obviamente activa el proceso inmediatamente. Otra categoría de excepciones son las señales que matan el proceso sin preguntar: esto siempre incluye SIGKILL, y también incluye otras señales (SIGINT, SIGHUP, SIGTERM, SIGQUIT,…) si el proceso no ha configurado un controlador para esa señal.

Si kill %1finaliza el trabajo 1, el shell le indicará que el trabajo finalizó. Si el proceso ha establecido un controlador para SIGTERM, entonces kill %1no tiene ningún efecto mientras el proceso esté suspendido; Para finalizar el proceso, también es necesario reanudarlo:

kill %1; kill -CONT %1

Si desea forzar la finalización del proceso sin darle ninguna oportunidad de limpieza, entonces haga

kill -KILL %1

(o kill -9 %1para abreviar).

Si desea eliminar todos los toplog.shprocesos, ya sea que se hayan iniciado desde este terminal o no, puede usar pkill toplog.sh.

Respuesta2

Puede eliminar todas las instancias de su secuencia de comandos cuando sepa cómo se llama su proceso durante el tiempo de ejecución (en este ejemplo, toplog.sh).

ps x | grep toplog.sh | grep -v grep | cut -d" " -f1 | xargs kill -9

PD xle proporciona una lista de todos sus procesos desde donde se buscará el proceso de destino. El segundo grep simplemente se asegura de eliminar la llamada grep de la lista. De lo contrario, obtendrás un error (que de hecho todavía no es un problema, pero es feo).cortar -d" " -f1corta cada línea en varias partes divididas por caracteres de espacio, donde *-f1** toma la primera parte.xargs matan -9mata todos los pid que se eliminan de la cadena de comando antes.

Para mayor comodidad, puede colocar esta línea en un script de eliminación donde el nombre del proceso se sustituye por el argumento del script de eliminación:

#!/bin/bash
ps x | grep $1 | grep -v grep | cut -d" " -f1 | xargs kill -9

Luego se llama al script con el nombre de los procesos que se van a eliminar.

./kill.sh toplog.sh

información relacionada