2010-03-07 8 views

Respuesta

44

Sí, si usted no hace nada más, entonces los comandos en un script bash son serializados. Se puede decir bash para ejecutar un montón de comandos en paralelo, y luego esperar a que todos ellos hasta el final, pero haciendo algo como esto:

command1 & 
command2 & 
command3 & 
wait 

Los símbolos de unión al final de cada una de las tres primeras líneas dice que bash ejecuta el comando en el fondo. El cuarto comando, wait, le dice a bash que espere hasta que todos los procesos secundarios hayan salido.

Tenga en cuenta que si hace las cosas de esta manera, no podrá obtener el estado de salida de los comandos secundarios (y set -e no funcionará), por lo que no podrá determinar si tuvieron éxito o fallaron de la manera habitual.

El bash manual tiene más información (busque wait, aproximadamente dos tercios del camino hacia abajo).

+3

Usted _puede realmente capturar los estados de retorno de los procesos. Obtenga el pid de cada comando usando '$!', Manténgalos en una matriz y luego recorra esa matriz, llamando 'wait pid; echo $? 'para cada pid. –

1

En general, a menos que explícitamente envió al fondo o se bifurcan apagado como un demonio, los comandos en un script de shell son serializados.

1

Esperan hasta que se termine el anterior. Sin embargo, puede escribir 2 scripts y ejecutarlos en procesos separados, para que puedan ejecutarse simultáneamente. En realidad, es una suposición descabellada, pero creo que obtendrás un error de acceso si un proceso intenta escribir en un archivo que está siendo leído por otro proceso.

3

A menos que explícitamente le pidas a bash que inicie un proceso en segundo plano, esperará hasta que el proceso finalice. Por lo tanto, si escribe esto:

foo args & 

bash continuará sin esperar a que foo salga. Pero si no pone explícitamente el proceso en segundo plano, bash esperará a que salga.

Técnicamente, un proceso puede ponerse efectivamente en segundo plano al bifurcar a un niño y luego salir. Pero dado que esa técnica es utilizada principalmente por procesos de larga duración, esto no debería afectarlo.

9

agregue '&' al final de un comando para ejecutarlo en paralelo. Sin embargo, es extraño porque en su caso el segundo comando depende del resultado final del primero. O bien utilizar comandos secuenciales o copiar a byc de una como esta:

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

+1: ¡Buen punto sobre la cuestión de copiar a/tmp/b y luego copiar/tmp/b a/tmp/c! –

+2

Era solo un ejemplo artificial (: – corydoras

+2

está claro, mi punto era tener cuidado al paralelizar comandos dependientes :) –

Cuestiones relacionadas