Como demonstrar suposições inválidas do PID?

1

Parece que muitos programadores estão satisfeitos com salvando um PID em um arquivo , e depois lêem e usam o PID como se fosse garantido que fosse o mesmo processo. Parece que a idéia geral é que as chances são boas o suficiente para serem ignoradas. Como posso simplesmente demonstrar este problema? O ideal é que os scripts de shell existentes possam ser adaptados para demonstrar isso com o mínimo de tentativa e erro.

Exemplo dummy:

foo &
pid=$!
echo $pid > pidfile
do
    kill $!
    sleep 1 &
until [ $pid -eq $! ]
kill "$(cat pidfile)" # Kills 'sleep', not 'foo'!
    
por l0b0 23.04.2013 / 14:54

1 resposta

2

Usar exec é uma boa demonstração da reutilização do 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 '
$ ./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
' ' ' < "/proc/$!/cmdline")" done rm foo bar

A execução deste script produz algo como o seguinte:

#!/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 '
$ ./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
' ' ' < "/proc/$!/cmdline")" done rm foo bar

Você pode usar programas arbitrários com exec , portanto não há garantia de que o processo nesse PID é o mesmo ou até similar.

    
por 23.04.2013 / 15:21