Manter 100 instâncias de um programa em execução

12

Atualmente, estou usando o supervisord para manter 100 instâncias de um script em execução ao mesmo tempo. Se algum dado morrer, ele inicia um novo.

No entanto, parece estar lutando para manter um número maior (> 300 processos) e estou procurando uma substituição. O Monit parece não fazer o que eu quero, pois monitora scripts individuais e não parece capaz de assistir facilmente 100 instâncias do mesmo script.

Alguma sugestão sobre uma ferramenta diferente que eu poderia usar?

jong
fonte
O que esses scripts estão fazendo e por que você deseja várias instâncias? Eles estão sendo executados com diferentes argumentos / ambiente ou o quê?
psusi 31/01
1
Um script simples do bash funcionaria? Algo como ... conte o número de processos de script em execução, se for menor que 100, inicie o número que está faltando?
Gabe.
3
O que você está tentando realizar? Por que alguns dos 300 processos estão morrendo? Provavelmente, existe uma maneira melhor de realizar sua tarefa, a menos importante é que, se 299 instâncias de um script em execução são menos boas que 300, algo está errado com sua arquitetura de aplicativo. Reiniciar processos que morreram sem entender por que eles morreram geralmente resultará em outra morte e resultará em sobrecarga substancial.
RSU
Estou trabalhando com um sistema legado aqui que está processando URLs e cada um precisa de seu próprio thread (sendo escrito em PHP). Sim, a arquitetura é falho, mas ainda tem que trabalhar com ela ... trabalhando em um novo um no momento :)
jong

Respostas:

1

Você pode usar:

ps h --ppid $$ | wc -l

para obter o número de processos filhos de um script bash (lembre-se de que isso inclui ps). Portanto, se você quiser ter 1000 processos, verifique se isso retorna 1001. Caso contrário, inicie-os com:

cmd &

para que eles sejam executados como filhos do script atual (e, portanto, sejam incluídos na contagem.) Você pode dormir um pouco e verificar novamente em um loop para sempre. Uma coisa a ter em mente é que, se você estiver gerando outros processos, precisará modificar o pscomando para filtrar os processos que deseja.

Esse primeiro comando é a peça principal do quebra-cabeça, deve ser um pouco mais até você ter seu script.

Kevin Cox
fonte
0

Eu usaria pgrep|wc -lou algo assim em um script de shell simples. Aguarde um segundo (ou menos no Linux, se quiser) entre cada verificação sleep.

Nils
fonte
0

Se o seu script morrer e retornar ao shell, você poderá usar um script de wrapper para cada instância:

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

ou você escreve algum wrapper que bifurca os scripts e usa wait/waitpidpara capturar processos mortos.

user1181667
fonte
1
Eu pelo menos iria dormir lá no final, apenas no caso do script ter alguma condição de terminal sempre falhar (a fatia está cheia, não é possível ler o arquivo de configuração, etc.) .. Caso contrário, você pode ter 100 processos em andamento. para uma fatia da CPU. Além disso - 100 * (processo de bater + pegada de arranque inicial de não aplicação) == potencialmente uma quantidade trivial de carneiro)
synthesizerpatel