Utrzymaj 100 wystąpień uruchomionego programu

12

Obecnie używam superwizora do obsługi 100 wystąpień skryptu jednocześnie. Jeśli jakakolwiek kostka, zaczyna nową.

Jednak wydaje się, że walczy o utrzymanie większej liczby (> 300 procesów) i szukam zamiennika. Monit nie wydaje się robić tego, co chcę, ponieważ monitoruje poszczególne skrypty i wydaje się, że nie jest w stanie z łatwością oglądać 100 wystąpień tego samego skryptu.

Jakieś sugestie dotyczące innego narzędzia, którego mógłbym użyć?

jong
źródło
Co robią te skrypty i dlaczego chcesz mieć wiele instancji? Czy są uruchamiane z różnymi argumentami / środowiskiem czy co?
psusi
1
Czy działałby prosty skrypt bash? Coś w stylu… policzyć liczbę uruchomionych procesów skryptowych, jeśli mniej niż 100, uruchomić liczbę, której brakuje?
Gabe.
3
Co próbujesz osiągnąć Dlaczego umiera niektóre z 300 procesów? Prawdopodobnie istnieje lepszy sposób na wykonanie zadania, z których przynajmniej 299 wystąpień skryptu jest mniej dobrych niż 300, coś jest nie tak z architekturą aplikacji. Ponowne uruchomienie procesów, które umarły bez zrozumienia, dlaczego umarły, często po prostu skutkuje kolejną śmiercią i w rezultacie pociąga za sobą znaczne koszty ogólne.
msw
Pracuję tutaj ze starszym systemem, który zajmuje się przetwarzaniem adresów URL i każdy potrzebuje własnego wątku (napisanego w PHP). Tak, architektura jest wadliwa, ale wciąż muszę z nią pracować ... W tej chwili pracuję nad nową :)
jong

Odpowiedzi:

1

Możesz użyć:

ps h --ppid $$ | wc -l

aby uzyskać liczbę procesów potomnych ze skryptu bash (pamiętaj, że to ps). Więc jeśli chcesz mieć 1000 procesów, sprawdź, czy to zwraca 1001. Jeśli nie, uruchom je za pomocą:

cmd &

aby działały jako dzieci bieżącego skryptu (i dlatego zostały uwzględnione w liczeniu.) Możesz potem trochę spać, a następnie sprawdzić ponownie w pętli na zawsze. Jedną z rzeczy, o których należy pamiętać, jest to, że jeśli spawnujesz inne procesy, będziesz musiał zmodyfikować pspolecenie, aby odfiltrować pożądane procesy.

To pierwsze polecenie jest kluczowym elementem układanki, powinno być tylko trochę więcej, dopóki nie otrzymasz skryptu.

Kevin Cox
źródło
0

Użyłbym pgrep|wc -lczegoś takiego w prostym skrypcie powłoki. Poczekaj sekundę (lub krócej w systemie Linux, jeśli chcesz) między każdym czekiem za pomocą sleep.

Nils
źródło
0

Jeśli twój skrypt umrze i po prostu wróci do powłoki, możesz użyć skryptu opakowania dla każdej instancji:

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

lub piszesz opakowanie, które rozwidla skrypty i używa wait/waitpiddo łapania martwych procesów.

użytkownik1181667
źródło
1
Pod koniec snułbym przynajmniej sen na wypadek, gdyby skrypt miał jakiś stan, w którym terminal zawsze się nie udaje (plasterek jest pełny, nie można odczytać pliku konfiguracyjnego itp.). W przeciwnym razie możesz mieć 100 procesów idących małpą na kawałek procesora. Dodatkowo - 100 * (proces bash + początkowy ślad po awarii aplikacji) == potencjalnie nietrywialna ilość pamięci RAM)
synthesizerpatel