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, ¿ combine
espera que ambos somethingElse
procesos terminen mientras ambos something
procesos continúan?
Pregunta 2: Si no, y sospecho que no, ¿cómo puedo combine
esperar solo para ambos somethingElse
procesos mientras los something
procesos 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
OutputA
yOutputB
solo le importaResult
? ¿Esto sería particularmente un ahorro de tiempo porque si tiene una E / S lenta al escribir en el disco, guardar los archivosOutputA
yOutputB
podrí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
outputA
youtputB
más de lo que la memoria puede contener, ¿derrotará todo el propósito?¿
combine
Esperará hasta que se completen ambos procesos antes de que comience a ejecutarse?fuente
combine
comenzará a ejecutarse tan pronto como sesomethingElse
hayan iniciado los dos comandos, pero está bien, porque las<(…)
cosas son tuberías; porcombine
lo tanto , simplemente se verá obligado a esperar datos si supera lossomethingElse
procesos. Y, como son tuberías, el tamaño no es un problema. … (Continúa)somethingElse
procesos, 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
wait
comando: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
,chmod
es como ejecutable, y lo ejecuta en el&background
de a&backgrounded ( subshell )
.El script
rms /tmp/file0-9
10 archivos yechoes
una línea cada segundo en los 10 de ellos. Capturo algo$info
del proceso rechazado y lo presento a través de$(command substitution). While ps
informes fijos sobre la$pid
captura, 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
wait
de 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)
yprintfs
yo$info
lo 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
ps
sus dos pids y esperar.fuente