Possivelmente específico do Linux, outros /proc
s podem se comportar de maneira diferente, mas no Linux você pode fazer isso:
( # subshell to preserve CWD
cd /proc/$pid || exit
[ "$expected_path" = "$(readlink exe)" ] || exit # optional, and can do more checks
while [ -d . ]; do sleep 1; done
)
O diretório de trabalho deixará de ser válido (e esse .
não existirá mais) quando o processo terminar. No entanto, se um novo processo tomar esse pid, ele não se tornará válido novamente. Se o processo sair (e o pid permanecer sem uso) antes do cd
, então cd
falhará e a sub-camada será encerrada. Se o pid foi reutilizado antes do cd
, então isso será bem-sucedido, mas as verificações "opcionais" (agradecimentos LJKims) o pegarão. Assim, desde que os cheques consigam uma corrida muito curta, não há condição de corrida. Para testar, você pode usar algo como:
# shell 1
$ sleep 10 &
[1] 26453
$ cd /proc/26453
# shell 2 (must be bash for BASHPID)
for ((i=0; i<200000; ++i)) do ( if [ 26453 -eq $BASHPID ]; then echo "I am have the pid — sleeping 60"; sleep 60; echo "done sleeping"; fi ); done
I have the pid — sleeping 60
# back to shell 1
[ -d . ]; echo $?
1
Então, ainda está percebendo que o sono em que ele estava interessado está encerrado, apesar do novo pid 26453.