Parece que muitos programadores estão satisfeitos comsalvando um PID em um arquivoe, posteriormente, leia e use o PID como se fosse garantido que fosse o mesmo processo. Parece que a ideia geral é que as probabilidades são boas o suficiente para serem ignoradas. Como posso simplesmente demonstrar esse problema? Idealmente, de tal forma que os scripts de shell existentes possam ser adaptados para demonstrar isso com o mínimo de tentativa e erro.
Exemplo fictício:
foo &
pid=$!
echo $pid > pidfile
do
kill $!
sleep 1 &
until [ $pid -eq $! ]
kill "$(cat pidfile)" # Kills `sleep`, not `foo`!
Responder1
Usar exec
é uma boa demonstração de reutilização de PID:
#!/bin/bash
cat > foo << 'EOF'
echo "Inside foo."
sleep 5
exec ./bar
EOF
cat > bar << 'EOF'
#!/bin/bash
echo "Inside bar."
sleep 5
EOF
chmod a+x foo bar
./foo &
while sleep 3; do
[[ -f "/proc/$!/cmdline" ]] || break
printf 'pid %d == %s\n' "$!" "$(tr '\0' ' ' < "/proc/$!/cmdline")"
done
rm foo bar
A execução deste script produz algo como o seguinte:
$ ./script
Inside foo.
pid 4953 == /bin/bash ./script
Inside bar.
pid 4953 == /bin/bash /tmp/tmp.AvDLtMWYPy/bar
pid 4953 == /bin/bash /tmp/tmp.AvDLtMWYPy/bar
Você pode usar exec
programas arbitrários, portanto não há garantia (de forma alguma) de que o processo naquele PID seja o mesmo, ou mesmo semelhante.