Поддерживать 100 экземпляров запущенной программы


12

В настоящее время я использую supervisord для поддержки 100 экземпляров скрипта, запускаемого одновременно. Если кто-то умирает, он начинает новый.

Однако, кажется, изо всех сил пытается поддерживать большее количество (> 300 процессов), и я ищу замену. Кажется, что Monit не выполняет то, что я хочу, поскольку он отслеживает отдельные сценарии и не может легко просматривать 100 экземпляров одного и того же сценария.

Любые предложения по другому инструменту, который я мог бы использовать?


Что делают эти сценарии и почему вы хотите несколько экземпляров? Они запускаются с разными аргументами / средой или как?
psusi

1
Будет ли работать простой скрипт bash? Что-то вроде ... подсчитать количество запущенных процессов скрипта, если меньше 100, запустить число, которое отсутствует?
таращиться

3
Что вы пытаетесь достичь? Почему некоторые из 300 процессов умирают? Вероятно, есть лучший способ выполнить вашу задачу, не в последнюю очередь, если 299 экземпляров запущенного скрипта менее хороши, чем 300, что-то не так с вашей архитектурой приложения. Перезапуск процессов, которые умерли, не понимая, почему они умерли, часто просто приводит к другой смерти и в результате приводит к значительным накладным расходам.
MSS

Я работаю с унаследованной системой, которая выполняет обработку URL-адресов, и каждому нужен собственный поток (написанный на PHP). Да, архитектура имеет недостатки, но до сих пор работать с ним ... Работа над новой на данный момент :)
жонг

Ответы:


1

Ты можешь использовать:

ps h --ppid $$ | wc -l

чтобы получить число дочерних процессов из скрипта bash (помните, что это включает в себя ps). Поэтому, если вы хотите иметь 1000 процессов, вы проверяете, возвращает ли это 1001. Если нет, запустите их:

cmd &

так что они запускаются как дочерние элементы текущего сценария (и, следовательно, включаются в счетчик). Затем вы можете немного поспать, а затем снова проверить в цикле навсегда. Следует помнить одну вещь: если вы запускаете другие процессы, вам нужно изменить psкоманду, чтобы отфильтровать нужные вам процессы.

Эта первая команда является основной частью головоломки, она должна быть немного больше, пока у вас не будет своего сценария.


0

Я хотел бы использовать pgrep|wc -lили что-то подобное в простом сценарии оболочки. Подождите одну секунду (или меньше в Linux, если хотите) между каждой проверкой с sleep.


0

Если ваш скрипт умирает и просто возвращается в оболочку, вы можете использовать скрипт-обертку для каждого экземпляра:

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

или вы пишете какую-то оболочку, которая разветвляет сценарии и использует их wait/waitpidдля отлова мертвых процессов.


1
Я бы по крайней мере бросил спать там в конце, на случай, если в скрипте есть какое-то условие «терминал всегда терпит неудачу» (срез полон, не может прочитать файл конфигурации и т. Д.). В противном случае вы могли бы получить 100 процессов, работающих в режиме ожидания. для кусочка процессора. Дополнительно - 100 * (процесс bash + начальный след запуска сбойного приложения) == потенциально нетривиальное количество оперативной памяти)
synthesizerpatel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.