Con bash
, tendrá esa garantía a menos que haya comenzado otro trabajo en segundo plano (y tenga en cuenta que los trabajos en segundo plano pueden iniciarse &
pero también con coproc
y con la sustitución de procesos) entre el foo &
y el wait
.
POSIX requiere que un shell recuerde el estado de salida de al menos 25 trabajos después de que se hayan ido , pero bash
recuerda mucho más que eso.
Ahora, si lo haces:
foo & pid=$!
...
bar &
wait "$pid"
No tiene ninguna garantía de que bar
no se le dará el mismo pid que foo
(si foo
ha terminado antes de que bar
comience), por lo que, aunque es poco probable, wait "$pid"
puede darle el estado de salida de bar
.
Puedes reproducirlo con:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
que (eventualmente) te dará en 0
lugar de 12
.
Para evitar el problema, una forma sería escribirlo como:
{
foo_pid=$!
while ps -p "$foo_pid"
do
ping -c 1 localhost
done
bar &
...
read <&3 ret
if [ "$ret" = 0 ]; then
echo foo was sucessful.
fi
} 3< <(foo > logfile 2>&1; echo "$?")
wait
no funciona. El proceso se recopila y el estado de salida se descarta justo antes de que se muestre la solicitud (de forma predeterminada).wait %1
error con "no existe tal trabajo" ya que el proceso en segundo plano se recopila inmediatamente después de que se completa el "sueño 5".%1
en lugar de$!
.bash -c '(sleep 1;exit 5) & sleep 2; wait %1; echo $?'
(también no es interactivo) no puede obtener el estado de salida de ese trabajo muerto. Suena como un error.set +e
. Parece que laset -e
función de bash mata el script tan pronto como sewait
Creo que su suposición es correcta. Aquí hay un extracto de la
man bash
espera de procesos en segundo plano.Entonces tal vez deberías comprobar 127
Hay una pregunta similar con una respuesta completamente diferente de la que podría ayudar.
La secuencia de comandos Bash espera los procesos y obtiene el código de retorno
editar 1
Inspirado por los comentarios y respuestas de @ Stephane, he ampliado su guión. Puedo comenzar unos 34 procesos en segundo plano antes de que comience a perder la pista.
tback
en mi sistema produce
fuente
bash -c '(exit 12) & sleep 1; wait "$!"; echo "$?"'
bash
una pista suelta (incluso después de comenzar miles de trabajos), mi ejemplo demuestra que el pid está siendo reutilizado, lo que también puede ser lo que observó en su caso.