2012-02-13 12 views
12

Estoy tratando de correr 3 comandos en paralelo en la cáscara del golpe:Bash y (comercial) del operador

$ (first command) & (second command) & (third command) & wait 

El problema con esto es que si first command falla, por ejemplo, el código de salida es 0 (I adivinar porque wait tiene éxito).

El comportamiento deseado es que si uno de los comandos falla, el código de salida será distinto de cero (e idealmente, los otros comandos en ejecución se detendrán).

¿Cómo puedo lograr esto?

Tenga en cuenta que quiero ejecutar los comandos en paralelo.

Respuesta

4

lo mejor que puedo pensar es:

first & p1=$! 
second & p2=$! 
... 

wait $p1 && wait $p2 && .. 

o

wait $p1 || (kill $p2 $p3 && exit 1) 
... 

sin embargo, esto todavía hace cumplir una orden para la verificación de los procesos, por lo que si la tercera falla de inmediato no se dará cuenta hasta el primer y segundo final.

4

Debe usar && en lugar de &. por ejemplo:

first command && second command && third command && wait 

Sin embargo, esto no se ejecutará el comando en paralelo como la ejecución de cada comando posterior dependerá de código de salida 0 de la orden anterior.

+3

Creo que funcionaría en términos de código de retorno, pero no ejecutará los comandos en paralelo. – jcollado

+0

De acuerdo e hice una nota en mi respuesta también. Sin embargo, si los comandos se ejecutan en paralelo, entonces no se puede verificar el código de salida porque el comando anterior no ha salido cuando se ejecuta el segundo. – anubhava

+1

La principal restricción aquí es ejecutar los comandos ** en paralelo **. No me importa reemplazar este one-liner con un script bash más complicado, siempre y cuando los comandos se ejecuten en paralelo y el código de salida sea distinto de cero en caso de fallas. –

2

Esto podría funcionar para usted:

parallel -j3 --halt 2 <list_of_commands.txt 

Esto ejecutará 3 comandos en paralelo.

Si falla alguna tarea en ejecución, matará las tareas restantes y luego se detendrá, devolviendo el código de salida de la tarea anómala.

+0

¿Podría proporcionar un puntero a documentos 'paralelos'? –

+0

Ejecutará 3 comandos en paralelo pero no cumplirá el requisito de código de salida de OP. – anubhava

+0

@MishaMoroshko google gnu parallel. @anubhava del manual paralelo '--halt 2 Elimina todos los trabajos inmediatamente y sale sin limpieza. El estado de salida será el estado de salida del trabajo defectuoso. – potong