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 
    . command2He visto algo sobre un waitcomando 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 alwaitcomando 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 PIDpara 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
comamnd1devolviera los PID de los procesos iniciados y los utilizarawaiten 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á
command1a 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