Eseguire più istanze di un programma in parallelo

Ho un comando, diciamo php process.php . Voglio eseguire 1000 istanza di questo comando per testare il carico causato sul server. Come posso fare questo?

Cose da notare:

  • Ctrl + C dovrebbe terminare tutte le istanze contemporaneamente

  • Funzionerà su un singolo core processor, quindi non c’è bisogno di funzionalità avanzate come il multi-threading.

  • Bello mostrare il numero corrente di istanza in esecuzione

  • I comandi dovrebbero essere visualizzati nello stesso terminale

  • I comandi non richiedono input

Puoi usare xargs . Basta stampare il nome del processo che si desidera 100 volte e passarlo a xargs :

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

Il comando Perl stampa semplicemente /path/to/process.php seguito da una nuova riga 100 volte. Questo viene quindi passato a xargs che viene detto di avviare fino a 100 comandi paralleli ( -P 100 ). Il -I {} dice a xargs di sostituire la stringa {} con il suo input. Pertanto, php {} viene esteso a php /path/to/process.php . Poiché tutto viene eseguito da xargs , un singolo Ctrl + C li ucciderà tutti e tutti gli output verranno stampati sullo stesso terminale.

Potresti usare uno script. Salvare quanto segue come run-parallel.sh e renderlo eseguibile ( chmod +x run-parallel.sh ):

 #! /bin/bash trap "pkill -P $$; kill -INT $$" INT while read n do "$@" & done < <(seq 1000) wait 

Spiegazione:

  • trap ... INT imposta un comando da eseguire quando viene ricevuto il segnale SIGINT (che è il segnale generato quando si preme Ctrl C ).
  • $$ è il PID del processo corrente (cioè dello script stesso). pkill -P $$ uccide quei processi il cui processo genitore è lo script.
  • È convenzione che un programma che cattura SIGINT uccida usando SIGINT dopo averlo riordinato. Quindi, il kill -INT $$ .
  • seq 1000 genera numeri da 1 a 1000.
  • Il ciclo while esegue il comando fornito come argomenti allo script una volta per ogni numero da seq e li invia allo sfondo.
  • Quindi wait tutti i processi in background finiscano di essere eseguiti.

Eseguilo così:

 ./run-parallel.sh php process.php 

Puoi scrivere un programma Master per avviare 1000 volte php process.php . L’uso di fork ed exec può essere utile se si usa C. Quando il master avvia un nuovo processo php , registra anche il suo pid .

Mostra il numero corrente dell’istanza in esecuzione: il Master può monitorare lo stato dei sottoprocessi.

Ctrl + C dovrebbe terminare tutte le istanze contemporaneamente: il Master acquisisce il segnale Ctrl + C e uccide tutti i sottoprocessi ( kill(pid, SIGKILL); ) o li notifica per uscire.