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 exec
es 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 exec
programas arbitrarios, por lo que no hay garantía (en absoluto) de que el proceso en ese PID sea el mismo, o incluso similar.