Wie lassen sich ungültige PID-Annahmen nachweisen?

Wie lassen sich ungültige PID-Annahmen nachweisen?

Es scheint, dass viele Programmierer zufrieden sind mitSpeichern einer PID in einer Datei, und dann später die PID lesen und verwenden, als ob es garantiert derselbe Prozess wäre. Es scheint, dass die allgemeine Idee darin besteht, dass die Chancen gut genug sind, um es zu ignorieren. Wie kann ich dieses Problem einfach demonstrieren? Idealerweise so, dass vorhandene Shell-Skripte angepasst werden können, um dies mit einem Minimum an Versuch und Irrtum zu demonstrieren.

Dummy-Beispiel:

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

Antwort1

Die Verwendung von execist eine ziemlich gute Demonstration der PID-Wiederverwendung:

#!/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

Das Ausführen dieses Skripts ergibt ungefähr Folgendes:

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

Sie können execbeliebige Programme verwenden, es gibt also keine (überhaupt keine) Garantie dafür, dass der Prozess bei diesem PID derselbe oder auch nur ähnlich ist.

verwandte Informationen