Executa múltiplas instâncias de um programa em paralelo

4

Eu tenho um comando, digamos php process.php . Eu quero executar 1000 instância deste comando para testar a carga causada no servidor. Como posso fazer isso?

Coisas a serem observadas:

  • Ctrl + C deve terminar todas as instâncias de uma só vez

  • Ele será executado em um processador de núcleo único, portanto, não há necessidade de recursos avançados, como multi-threading.

  • É bom mostrar o número atual de instâncias em execução no topo

  • Os comandos devem sair no mesmo terminal

  • Os comandos não exigem entrada

por VarunAgw 23.12.2015 / 18:02

3 respostas

8

Você pode usar xargs . Basta imprimir o nome do processo que você deseja 100 vezes e passá-lo para xargs :

perl -e 'print "/path/to/process.php\n" x 100' | xargs -P 100 -I {} php {} 

O comando Perl simplesmente imprime /path/to/process.php seguido por uma nova linha 100 vezes. Isso é então passado para xargs , que é informado para iniciar até 100 comandos paralelos ( -P 100 ). O -I {} indica xargs para substituir a string {} pela sua entrada. Portanto, php {} é expandido para php /path/to/process.php . Como tudo é feito por xargs , um único Ctrl + C irá matar todos eles, e toda a saída será impressa no mesmo terminal.

    
por terdon 23.12.2015 / 19:47
6

Você pode usar um script. Salve o seguinte como run-parallel.sh e torne-o executável ( chmod +x run-parallel.sh ):

#! /bin/bash
trap "pkill -P $$; kill -INT $$" INT

while read n
do
    "$@" &
done < <(seq 1000)
wait

Explicação:

  • trap ... INT define um comando para ser executado quando o sinal SIGINT é recebido (que é o sinal gerado quando você pressiona Ctrl C ).
  • $$ é o PID do processo atual (isto é, do próprio script). pkill -P $$ mata os processos cujo processo pai é o script.
  • É convencionado que um programa que captura SIGINT se mata usando SIGINT depois que ele é arrumado. Portanto, o kill -INT $$ .
  • seq 1000 gera números de 1 a 1000.
  • O loop while executa o comando fornecido como argumentos para o script uma vez para cada número de seq e os envia para o segundo plano.
  • Então, wait até que todos os processos em segundo plano concluam a execução.

Execute assim:

./run-parallel.sh php process.php
    
por muru 23.12.2015 / 19:07
0

Você pode escrever um programa mestre para iniciar 1000 vezes php process.php . Usar fork e exec pode ser conveniente se você usar C. Quando o mestre inicia um novo processo php , ele também grava seu pid .

Mostra o número atual da instância em execução: o mestre pode monitorar o status dos subprocessos.

Ctrl + C deve terminar todas as instâncias de uma só vez: o mestre captura o sinal Ctrl + C e mata todos os subprocessos ( kill(pid, SIGKILL); ) ou os notifica para sair.

    
por Hangchen Yu 23.12.2015 / 18:18