come eseguire più script di shell in parallelo

Ho alcuni script di test, ognuno dei quali esegue un'applicazione PHP di prova. Ogni script viene eseguito per sempre.

Quindi, cat.sh , dog.sh e foo.sh eseguono ciascuno uno script PHP. Ogni script di shell gestisce l'applicazione PHP in un ciclo, quindi funziona per sempre, dormendo dopo each esecuzione.

Sto cercando di capire come eseguire gli script in parallelo allo stesso tempo. Vedere l'output delle applicazioni PHP nella window di stdout / term.

Ho pensato di fare qualcosa come i seguenti potrebbero funzionare:

 foo.sh > &2 dog.sh > &2 cat.sh > &2 

In uno script di shell sarebbe sufficiente, ma non funziona.

 foo.sh, runs foo.php once, and it runs correctly dog.sh, runs dog.php in a never ending loop. it runs as expected cat.sh, runs cat.php in a never ending loop *** this never runs!!! 

Sembra che lo script di shell non arriva mai a eseguire cat.sh Se cat.sh in se stessa in una window separata / termine, funziona come previsto.

Qualcuno ha delle idee su come posso get questi script da eseguire in parallelo?

  • eseguire script come utente che dispone di shell nologin
  • Personalizzazione rapida: come rilevare quando non c'è tty
  • Effettuare le modifiche variables PATH permanenti su openSuse
  • Che cosa è "-bash:!": Evento non trovato "
  • Come eseguire un command su più host utilizzando solo IPv6?
  • Nonostante #! / Usr / bin / env php Devo call il file con php, perché?
  • amersand all'inizio di una linea in csh
  • bash: "set -e" e verificare se esiste un utente esegue l'output script
  • 4 Solutions collect form web for “come eseguire più script di shell in parallelo”

    L'impostazione corrente è eseguita in sequenza. Il primo funziona e completa , permettendo alla seconda di iniziare. Il secondo non finisce mai, quindi il terzo non ha mai avuto la possibilità di iniziare.

    Prova questo:

     foo.sh >foo.out 2>foo.err & dog.sh >dog.out 2>dog.err & cat.sh >cat.out 2>cat.err & 

    Ciò indicherà a ciascun command di eseguire in background e submit le proprie informazioni di output e di errore ai file. Quando un command viene eseguito in background, si disconnette dalla session corrente e consente di eseguire il command successivo. È importnte posizionare l'ampersand ( & ) come ultimo carattere della linea. Altrimenti, potrebbe non essere riconosciuto correttamente.

    In alternativa, ognuno dei tuoi script di shell eseguire lo script .php associato che apparentemente chiama con la stessa semantica come sopra. In questo scenario, il tuo foo.sh potrebbe contenere:

     #!/bin/bash php foo.php >foo.out 2>foo.err & 

    Infine, se hai bisogno di un'operazione parallela, controlla GNU Parallel .

    Nota: se si desidera veramente che l'output venga visualizzata sullo schermo / terminal, è ansible lasciare fuori il reindirizzamento di output:

     foo.sh & 

    Ricorda comunque che l'esecuzione di più comandi contemporaneamente può causare un'output confusa (ora si può sapere quali output o errori sono stati generati da quale command) e se si esce dall'output, l'output non ha nessun posto da percorrere.

    Ciò può essere fatto con il command parallelo.

    Belli esempi: parallelo

     [me@neo]<bash><~> 19 05:51 Tue Mar 05 > man -f parallel parallel (1) - run programs in parallel 

     parallel -j 3 -- "sh foo.sh" "sh dog.sh" "sh cat.sh" 

    Questo avvierà 3 script in parallelo, allo stesso tempo.

     parallel sh -c "echo hi; sleep 2; echo bye" -- 1 2 3 

    Questo avvierà per impostazione predefinita come molti processi dello stesso command, a seconda del numero di CPU.

     parallel -j 3 sh -c "echo hi; sleep 2; echo bye" -- 1 2 3 

    Ciò forzerà di eseguire 3 processi allo stesso tempo, anche se si dispone di appena 2 CPU.

    Esempio:

     [me@neo]<bash><~> 31 06:09 Tue Mar 05 > parallel -j 10 sh -c "echo Hello World; sleep 3; echo Good morning" -- $(seq 1 10) Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Good morning Good morning Good morning Good morning Good morning Good morning Good morning Good morning Good morning Good morning 

    Chris ha la buona idea generale per la maggior parte degli script: chiude each command con & e andranno in background. Detto questo, ecco la mia cosa che tengo in giro per alcuni compiti di alto livello. Permettethemes di presentarvi al mio pratico script di toolbox, parallel-exec.pl

      #!/usr/bin/perl use threads; use Thread::Queue; my @workers; my $num_threads = shift; my $dbname = shift; my $queue = new Thread::Queue; for (0..$num_threads-1) { $workers[$_] = new threads(\&worker); print "TEST!\n"; } while ($_ = shift @ARGV) { $queue->enqueue($_); } sub worker() { while ($file = $queue->dequeue) { system ('./parser.pl', $dbname, $file); } } for (0..$num_threads-1) { $queue->enqueue(undef); } for (0..$num_threads-1) { $workers[$_]->join; } 

    Con una certa modifica della luce è ansible modificare il numero di thread, fornire una serie di comandi, ecc. Poiché questo è in questo momento, prende il numero di thread specificati nella row di command, un nome di database e un elenco di file da importre , quindi spawn un'istanza per each file che esegue il numero specificato contemporaneamente.

    o … puoi farlo come questo:

     threads=20 tempfifo=$PMS_HOME/$$.fifo trap "exec 1000>&-;exec 1000<&-;exit 0" 2 mkfifo $tempfifo exec 1000<>$tempfifo rm -rf $tempfifo for ((i=1; i<=$threads; i++)) do echo >&1000 done for ((j=1; j<=1000; j++)) do read -u1000 { echo $j echo >&1000 } & done wait echo "done!!!!!!!!!!" 

    each volta, esegue 20 thread in parallelo.

    spero che aiuti 🙂

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.