por que há comportamento aleatório para um trabalho em segundo plano?

1

analisando o guia avançado de scripts do bash exemplo 3.3 executando um loop em segundo plano, encontrei este :

#!/bin/bash
# background-loop.sh
for i in 1 2 3 4 5 6 7 8 9 10 # First loop.
do
echo -n "$i "
done & # Run this loop in background.
# Will sometimes execute after second loop.
echo # This 'echo' sometimes will not display.
for i in 11 12 13 14 15 16 17 18 19 20 # Second loop.
do
echo -n "$i "
done
echo # This 'echo' sometimes will not display.
# ======================================================
# The expected output from the script:
# 1 2 3 4 5 6 7 8 9 10
# 11 12 13 14 15 16 17 18 19 20
# Sometimes, though, you get:
# 11 12 13 14 15 16 17 18 19 20
# 1 2 3 4 5 6 7 8 9 10 bozo $
# (The second 'echo' doesn't execute. Why?)
# Occasionally also:
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# (The first 'echo' doesn't execute. Why?)
# Very rarely something like:
# 11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20
# The foreground loop preempts the background one.
exit 0

# Nasimuddin Ansari suggests adding sleep 1
#+ after the echo -n "$i" in lines 6 and 14,
#+ for some real fun.

Eu não entendo isso, alguém entende isso.

    
por munish 12.12.2012 / 09:01

1 resposta

3

Os trabalhos em segundo plano são executados de forma assíncrona. Isso significa que você é capaz de prever a ordem de execução apenas por definição. Teoricamente, mesmo com a adição de sleep você ainda pode encontrar o problema: esperar apenas por alguns segundos não elimina a natureza assíncrona dos trabalhos bg, a única coisa que você está fazendo é simplesmente diminuir a probabilidade de tal confusão.

    
por 12.12.2012 / 10:51