Mantener 100 instancias de un programa en ejecución

12

Actualmente estoy usando supervisor para mantener 100 instancias de un script ejecutándose a la vez. Si alguno muere, entonces comienza uno nuevo.

Sin embargo, parece estar luchando por mantener números más grandes (> 300 procesos) y estoy buscando un reemplazo. Monit no parece hacer lo que quiero, ya que monitorea guiones individuales y no parece poder ver fácilmente 100 instancias del mismo guión.

¿Alguna sugerencia sobre una herramienta diferente que pueda usar?

jong
fuente
¿Qué están haciendo estos scripts y por qué quieres múltiples instancias? ¿Se están ejecutando con diferentes argumentos / entorno o qué?
psusi
1
¿Funcionaría un simple script bash? Algo así como ... ¿cuenta el número de procesos de script que se ejecutan, si es menos de 100, inicia el número que falta?
Gabe.
3
¿Qué estás tratando de lograr? ¿Por qué están muriendo algunos de los 300 procesos? Probablemente haya una mejor manera de llevar a cabo su tarea, y la más importante es que si 299 instancias de un script en ejecución son menos buenas que 300, algo tiene fallas en la arquitectura de su aplicación. Reiniciar procesos que murieron sin comprender por qué murieron a menudo solo dará como resultado otra muerte e incurrirá en una sobrecarga sustancial como resultado.
msw 01 de
Estoy trabajando con un sistema heredado que está procesando URL y cada uno necesita su propio hilo (escrito en PHP). Sí, la arquitectura es defectuosa, pero todavía tengo que trabajar con ella ... Trabajando en una nueva en este momento :)
jong

Respuestas:

1

Puedes usar:

ps h --ppid $$ | wc -l

para obtener el número de procesos secundarios de un script bash (recuerde que esto incluye ps). Entonces, si desea tener 1000 procesos, verifique si eso devuelve 1001. Si no, enciéndalos con:

cmd &

para que se ejecuten como elementos secundarios del script actual (y, por lo tanto, se incluyan en el recuento). Luego puede dormir un poco y luego volver a comprobarlo en un bucle para siempre. Una cosa a tener en cuenta es que si está generando otros procesos, deberá modificar el pscomando para filtrar los procesos que desee.

Ese primer comando es la pieza central del rompecabezas, solo debería ser un poco más hasta que tenga su script.

Kevin Cox
fuente
0

Yo usaría pgrep|wc -lo algo así en un simple script de shell. Espere un segundo (o menos en Linux si lo desea) entre cada verificación con sleep.

Nils
fuente
0

Si su secuencia de comandos muere y simplemente volvería al shell, puede usar una secuencia de comandos de envoltura para cada instancia:

while [ 1 == 1 ] ; do /path/to/script ; done

o escribes un contenedor que bifurca los scripts y los usa wait/waitpidpara atrapar procesos muertos.

usuario1181667
fuente
1
Al menos me gustaría dormir allí al final, en caso de que el script tenga alguna condición de terminal siempre falla (el segmento está lleno, no se puede leer el archivo de configuración, etc.) De lo contrario, podría tener 100 procesos simulados por una rebanada de CPU. Además - 100 * (proceso bash + huella inicial de inicio de la aplicación que falla) == potencialmente una cantidad no ram de ram)
sintetizadorpatel