Esegui i comandi in parallelo e attendi il completamento di un gruppo di comandi prima di iniziare il successivo


12

Ho uno script che include più comandi. Come posso raggruppare i comandi da eseguire insieme (voglio creare più gruppi di comandi. All'interno di ciascun gruppo, i comandi dovrebbero essere eseguiti in parallelo (allo stesso tempo). I gruppi dovrebbero essere eseguiti in sequenza, aspettando che un gruppo finisca prima di iniziare il gruppo successivo) ... ad es

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

come posso eseguire ogni 3 comandi per ottenere? Provai:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Ma questo non ha funzionato correttamente (voglio eseguire i gruppi di comandi in parallelo allo stesso tempo. Inoltre devo aspettare che il primo gruppo finisca prima di eseguire il gruppo successivo)

Lo script esce con un messaggio di errore!


2
Che cosa vuoi dire, corri insieme. Intendi correre in parallelo allo stesso tempo? Come fai a sapere che "non ha funzionato correttamente?" Come saprai quando funziona correttamente? Vuoi aspettare che il primo gruppo finisca prima di eseguire il gruppo successivo?
RobertL,

@ RobertL. Sì, intendo in parallelo allo stesso tempo. Lo script esce con un messaggio di errore. Sì, devo aspettare che finisca il primo gruppo prima di eseguire il gruppo successivo.

1
@goro ti sta citando, lo script esce con un messaggio di errore. Modifica la tua domanda per aggiungere tale messaggio (per amor di completamento) e rimuovere la chat chit (consigli apprezzati).
dave_alcarin,

È lo stesso comando in esecuzione in ogni istanza? Stesso nome?
RobertL,

1
@goro, è esatto? "Hai diversi gruppi di comandi. All'interno di ciascun gruppo, i comandi dovrebbero essere eseguiti in parallelo (allo stesso tempo). I gruppi dovrebbero essere eseguiti in sequenza, in attesa che un gruppo termini prima di iniziare il gruppo successivo."
RobertL,

Risposte:


20

I comandi all'interno di ciascun gruppo vengono eseguiti in parallelo e i gruppi vengono eseguiti in sequenza, ogni gruppo di comandi paralleli in attesa che il gruppo precedente termini prima di iniziare l'esecuzione.

Di seguito è riportato un esempio funzionante:

Assumi 3 gruppi di comandi come nel codice qui sotto. In ogni gruppo i tre comandi vengono avviati in background con &.

I 3 comandi verranno avviati quasi contemporaneamente ed eseguiti in parallelo mentre lo script waitsdeve terminare.

Dopo l' command 10esecuzione di tutti e tre i comandi nella terza uscita del gruppo .

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   

Penso che i ricci nel tuo esempio siano totalmente privi di significato. L'attesa è globale di processo e in questo caso i gruppi curly non creeranno un nuovo fork.
PSkocik,

1
@PSkocik, True. Organi vestigiali.
RobertL,

6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Dovrebbe funzionare (ogni singolo componente di terzina verrà eseguito in sequenza, ma i gruppi hte verranno eseguiti in parallelo). Probabilmente non vuoi che la tua shell genitrice esca prima che i gruppi abbiano terminato - da qui il wait.


2
La domanda originale diceva solo "esegui ogni 3 comandi insieme". Senza chiarimenti, entrambe le risposte sono corrette. Buona chiamata al wait.
RobertL,
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.