2010-03-07 8 views

risposta

44

Sì, se non altro, allora i comandi in uno script bash vengono serializzati. Si può dire bash per eseguire una serie di comandi in parallelo, e quindi attendere per tutti loro per finire, ma fare qualcosa di simile:

command1 & 
command2 & 
command3 & 
wait 

I e commerciali al termine di ciascuno dei primi tre righe dice a Bash di eseguire il comando in background. Il quarto comando, wait, dice a bash di attendere fino all'uscita di tutti i processi secondari.

Nota che se fai le cose in questo modo, non sarai in grado di ottenere lo stato di uscita dei comandi figli (e set -e non funzionerà), quindi non sarai in grado di dire se sono riusciti o meno nel solito modo.

Il bash manual ha ulteriori informazioni (cercare wait, circa due terzi della via verso il basso).

+3

Si _can_ effettivamente catturare gli stati di ritorno dei processi. Ottieni il pid di ogni comando usando '$!', Tienili in una matrice e poi fai un ciclo attraverso quella matrice, chiamando 'wait pid; echo $? 'per ogni pid. –

1

In generale, a meno che non siano inviati esplicitamente in background o si aprano come demone, i comandi in uno script di shell sono serializzati.

1

Aspettano fino a quando il precedente è finito. Tuttavia, è possibile scrivere 2 script ed eseguirli in processi separati, in modo che possano essere eseguiti simultaneamente. È una supposizione sfrenata, davvero, ma penso che otterrai un errore di accesso se un processo tenta di scrivere in un file che viene letto da un altro processo.

3

A meno che non dica esplicitamente a bash di avviare un processo in background, esso aspetterà fino all'uscita del processo. Quindi se scrivi questo:

foo args & 

bash continuerà senza aspettare che foo esca. Ma se non si mette esplicitamente il processo in background, bash attenderà che esca.

Tecnicamente, un processo può effettivamente mettersi in secondo piano biforcandosi un bambino e quindi uscendo. Ma dal momento che questa tecnica viene utilizzata principalmente da processi di lunga durata, ciò non dovrebbe influire su di te.

9

aggiungere '&' alla fine di un comando per eseguirlo in parallelo. Tuttavia, è strano perché nel tuo caso il secondo comando dipende dal risultato finale del primo. O utilizzare i comandi sequenziali o copiare per B e C da una come questo:

cp /tmp/a /tmp/b & 
cp /tmp/a /tmp/c & 
+4

+1: buon punto sulla domanda copiando in/tmp/b e quindi copiando/tmp/b in/tmp/c! –

+2

Era solo un esempio artificiale (: – corydoras

+2

questo è chiaro, il mio punto era fare attenzione quando si parallelizzava i comandi dipendenti :) –

Problemi correlati