espera e reciclagem de PID

3

Eu tenho uma preocupação em que, em um script, eu estarei chamando versões paralelas de uma função para executar em segundo plano e, em seguida, emitindo uma espera.

a () {
  sleep $1
}

a 10 &
PIDs="$PIDs $!"
a 50000 &
PIDs="$PIDs $!"

wait $PIDs   

A preocupação é que a primeira chamada de função leva 10 segundos (sleep 10), mas a segunda leva quase 14 horas (sleep 50000).

Estou preocupado que o PID da primeira chamada seja recalculado e, 14 horas depois, quando a segunda invocação for encerrada, que o PID esteja sendo usado por outro processo e impeça a continuação do script. Ou esperar remover o primeiro PID da lista assim que a invocação for concluída e simplesmente esperar que o segundo processo seja concluído, em vez de esperar que ambos terminem no final?

    
por chiefmanc 13.01.2016 / 11:37

2 respostas

6

Veja por si mesmo que o wait builtin não irá esperar por um processo aleatório - somente filhos do shell atual.

#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done

$ ./t.sh
sleeping 3 seconds...
waiting for 93208...     ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done
    
por 13.01.2016 / 13:17
-2

Eu assumo que você está executando o Linux. Considerando que:

Você pode aumentar kernel.pid_max em /etc/sysctl.conf . O valor padrão é 32768 e se aplica se isso não estiver explicitamente definido nele. Adicione algo como:

kernel.pid.max = 4000000

Carregue o sysctl.conf modificado com:

# sysctl -p

Isso pode ser feito sem qualquer tempo de inatividade ou outra interrupção.

    
por 13.01.2016 / 13:05