Estoy escribiendo un guión, pero hay algo que necesito y no puedo encontrar una manera de hacerlo ...
Necesito hacer un comando en segundo plano "command1 &" y luego en algún lugar del script necesito esperar a que termine antes de ejecutar command2. Básicamente, necesito esto:
NOTA: ¡cada comando se ejecuta en un directorio específico! al final del ciclo while, mi comando1 creó 4 directorios, donde en cada uno se ejecuta el proceso específico, por lo que el total del proceso en ejecución es 4
a=1
while [$a -lt 4 ]
. command1
#Generates 1 Process
a= `export $a +1`
done
#Wait until the 4 process end and then run the command2
. command2
He visto algo sobre un wait
comando con el número de proceso pid, pero eso tampoco funcionó.
shell
scripting
background-process
Joao Macau
fuente
fuente
command1
? ¿Se puede modificar para que devuelva los PID de los 4 procesos?$!
variable para obtener esto, pasándola alwait
comando como lo mostré allí.$!
contiene el último PID en segundo plano, mientras que$$
contiene el último PID de la ejecución del proceso.Respuestas:
Puede usar el comando
wait PID
para esperar a que finalice un proceso.También puede recuperar el PID del último comando con
$!
En su caso, algo como esto funcionaría:
Después de su edición, ya que tiene varios PID y los conoce, puede hacer eso:
fuente
La forma más limpia de hacer esto sería que le
comamnd1
devolviera los PID de los procesos iniciados y los utilizarawait
en cada uno de ellos, como sugiere la respuesta de @ LaurentC .Otro enfoque sería algo como esto:
fuente
Si utiliza el siguiente método, es posible que no necesite una "espera para todos los procesos" especial después del ciclo while. El ciclo esperará
command1
a que se complete la corriente antes de volver al principio. Tenga cuidado como con cualquier consejo. Tenga en cuenta que lo único que hice fue agregar& wait $!
al final de sucommand1
.fuente