Mantenere 100 istanze di un programma in esecuzione


12

Attualmente sto usando Supervord per mantenere in esecuzione 100 istanze di uno script contemporaneamente. Se uno muore, ne inizia uno nuovo.

Tuttavia, sembra che stia lottando per mantenere un numero maggiore (> 300 processi) e sto cercando un sostituto. Monit non sembra fare quello che voglio in quanto monitora singoli script e non sembra essere in grado di guardare facilmente 100 istanze dello stesso script.

Qualche suggerimento su uno strumento diverso che potrei usare?


Cosa stanno facendo questi script e perché vuoi più istanze? Vengono eseguiti con diversi argomenti / ambiente o cosa?
psusi

1
Un semplice script bash funzionerebbe? Qualcosa come ... contare il numero di processi di script in esecuzione, se inferiore a 100, avviare il numero che manca?
gabe.

3
Cosa stai cercando di realizzare? Perché alcuni dei 300 processi stanno morendo? Probabilmente esiste un modo migliore per svolgere il tuo compito, non ultimo il caso in cui 299 istanze di uno script in esecuzione sono meno buone di 300, qualcosa è imperfetto nell'architettura dell'applicazione. Il riavvio dei processi che sono morti senza capire il motivo della loro morte si tradurrà spesso in un'altra morte e di conseguenza comporterà un notevole sovraccarico.
msw,

Sto lavorando con un sistema legacy qui che sta elaborando URL e ognuno ha bisogno del proprio thread (in fase di scrittura in PHP). Sì, l'architettura è imperfetta, ma devo ancora lavorare con essa ... Al momento ne
sto

Risposte:


1

Puoi usare:

ps h --ppid $$ | wc -l

per ottenere il numero di processi figlio da uno script bash (ricorda che include ps). Quindi, se vuoi avere 1000 processi, controlla se ciò restituisce 1001. In caso contrario, accendili con:

cmd &

in modo che vengano eseguiti come figli dello script corrente (e quindi vengano inclusi nel conteggio). È quindi possibile dormire un po ', quindi ricontrollare in un ciclo per sempre. Una cosa da tenere a mente è che se si generano altri processi, sarà necessario modificare il pscomando per filtrare i processi desiderati.

Quel primo comando è il pezzo centrale del puzzle, dovrebbe essere solo un po 'di più fino a quando non hai il tuo script.


0

Userei pgrep|wc -lo qualcosa del genere in un semplice script di shell. Attendere un secondo (o meno su Linux se lo si desidera) tra ogni controllo con sleep.


0

Se il tuo script muore e tornerà alla shell, puoi usare uno script wrapper per ogni istanza:

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

oppure scrivi un wrapper che esegue il fork degli script e lo utilizza wait/waitpidper catturare i processi morti.


1
Almeno darei un sonno lì alla fine, nel caso in cui lo script abbia una condizione di terminale sempre non riuscita (slice è piena, non riesco a leggere il file di configurazione, ecc.) Altrimenti potresti avere 100 processi ape per una fetta di CPU. Inoltre - 100 * (processo bash + impronta di avvio iniziale dell'app in errore) == potenzialmente una quantità non banale di RAM)
synthesizerpatel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.