Tengo (aún) otra wait, &, &&pregunta flujo de control ..
Digamos que tengo un script como este donde quiero hacer tanto trabajo al mismo tiempo como sea posible:
# may take some hours
something InputA > IrrelevantA &
something InputB > IrrelevantB &
# may take an hour
(
somethingElse InputA > OutputA &
somethingElse InputB > OutputB &
)&& combine OutputA OutputB > Result
...morestuff
Pregunta 1: En el script, ¿ combineespera que ambos somethingElseprocesos terminen mientras ambos somethingprocesos continúan?
Pregunta 2: Si no, y sospecho que no, ¿cómo puedo combineesperar solo para ambos somethingElseprocesos mientras los somethingprocesos anteriores continúan funcionando en segundo plano?
fuente

¿La sustitución del proceso sería más eficiente, especialmente si no necesita guardar los archivos
OutputAyOutputBsolo le importaResult? ¿Esto sería particularmente un ahorro de tiempo porque si tiene una E / S lenta al escribir en el disco, guardar los archivosOutputAyOutputBpodría ser el paso de limitación de velocidad?La sustitución de procesos le permite colocar el comando dentro en
<(..here..)lugar de guardar el resultado en un archivo y luego leerlo como entrada en el paso "combinar".Si la memoria es una limitación, y el tamaño
outputAyoutputBmás de lo que la memoria puede contener, ¿derrotará todo el propósito?¿
combineEsperará hasta que se completen ambos procesos antes de que comience a ejecutarse?fuente
combinecomenzará a ejecutarse tan pronto como sesomethingElsehayan iniciado los dos comandos, pero está bien, porque las<(…)cosas son tuberías; porcombinelo tanto , simplemente se verá obligado a esperar datos si supera lossomethingElseprocesos. Y, como son tuberías, el tamaño no es un problema. … (Continúa)somethingElseprocesos, y no está del todo claro si eso es importante para el autor de la pregunta. Pero, además, una respuesta no debería ser hacer preguntas como esa.Puedes usar el
waitcomando:Puede ver que la línea "inicial" ocurre de inmediato, y que la "lista" espera 10 segundos.
fuente
De hecho, demuestro exactamente cómo se podría hacer este tipo de cosas en otra respuesta aquí . Esa respuesta fue a una pregunta sobre cómo garantizar que 2 registros se mantuvieran mediante un proceso en segundo plano, así que lo demostré con 10.
Script de demostración
Ejecutar demo
Salida:
Lo anterior demuestra. Construye y ejecuta un script llamado
/tmp/script,chmodes como ejecutable, y lo ejecuta en el&backgroundde a&backgrounded ( subshell ).El script
rms /tmp/file0-910 archivos yechoesuna línea cada segundo en los 10 de ellos. Capturo algo$infodel proceso rechazado y lo presento a través de$(command substitution). While psinformes fijos sobre la$pidcaptura, sé que todavía se ejecuta, así quesleep.cuando se completa, se cuentan las líneas en los 10 archivos conwc.Después de invocar un proceso de esta manera, puede cerrar libremente su proceso padre original y continuará transportando en camiones: se desautoriza efectivamente. Esto también significa que no puede utilizar el convencional
waitde comandos, pero espera enps's de retorno debe ser más robusto en cualquier caso.Vale la pena mencionar, creo, que el proceso se llama inicialmente
$(command substitution)yprintfsyo$infolo deseo para poder controlarlo de manera efectiva. Pero tan pronto como deja caer su salida de terminal conexec 1>&2(que se cierra en la misma subshell con2>&-), el proceso se escapa y tengo que esperar en el otro extremo. Un poco lo mejor de ambos mundos, especialmente si lo usa para manejar tuberías de entrada, siempre que pueda comprender todas las redirecciones y líderes de procesos.Todo lo demás es solo para demostración aquí. Todo lo que necesita para ejecutar este es el script superior y:
NOTA: Esto solo imprime en la terminal exactamente lo que deseaba demostrar. Como se señaló en
$PPID,este proceso, el terminal no lo reconoce y es un hijo directo de$PID 1.Si desea ejecutar dos de estos al mismo tiempo y esperarlos, simplemente puede entregar
pssus dos pids y esperar.fuente