¿Cómo demostrar suposiciones de PID no válidas?

¿Cómo demostrar suposiciones de PID no válidas?

Parece que muchos programadores están contentos conguardar un PID en un archivoy luego leer y usar el PID como si estuviera garantizado que sería el mismo proceso. Parece que la idea general es que las probabilidades son lo suficientemente buenas como para ignorarlas. ¿Cómo puedo demostrar simplemente este problema? Idealmente, de tal manera que los scripts de shell existentes puedan adaptarse para demostrar esto con el mínimo de prueba y error.

Ejemplo ficticio:

foo &
pid=$!
echo $pid > pidfile
do
    kill $!
    sleep 1 &
until [ $pid -eq $! ]
kill "$(cat pidfile)" # Kills `sleep`, not `foo`!

Respuesta1

El uso execes una demostración bastante buena de la reutilización 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

Al ejecutar este script se obtiene algo como lo siguiente:

$ ./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

Puede utilizar execprogramas arbitrarios, por lo que no hay garantía (en absoluto) de que el proceso en ese PID sea el mismo, o incluso similar.

información relacionada