Підтримуйте 100 примірників запущеної програми


12

Наразі я використовую нагляд, щоб підтримувати 100 екземплярів сценарію, що працює відразу. Якщо хтось помре, то він запускає новий.

Однак, схоже, це намагається підтримувати більшу кількість (> 300 процесів), і я шукаю заміну. Моніт, здається, не робить те, що я хочу, оскільки він контролює окремі сценарії, і, схоже, не може легко переглядати 100 примірників того ж сценарію.

Будь-які пропозиції щодо іншого інструменту я можу використати?


Що роблять ці сценарії і чому вам потрібні кілька примірників? Вони керуються різними аргументами / середовищем чи що?
psusi

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

3
Що ви намагаєтеся досягти? Чому вмирають деякі з 300 процесів? Напевно, є кращий спосіб виконати своє завдання, не менш того, якщо 299 екземплярів запущеного сценарію менш хороші, ніж 300, що-небудь зіпсується з вашою архітектурою додатків. Перезапуск процесів, які загинули, не розуміючи, чому вони загинули, часто просто призводить до іншої смерті та зазнає значних накладних витрат.
msw

Я працюю зі спадковою системою, яка займається обробкою URL-адрес, і кожна з них потребує власного потоку (записується в PHP). Так, архітектура є хибною, але з нею все одно працювати ... Наразі працюю над новою :)
jong

Відповіді:


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 * (баш-процес + початковий слід запуску програми, що не працює) == потенційно нетривіальна кількість барана)
синтезаторпател
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.