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 exec
ist 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 exec
beliebige Programme verwenden, es gibt also keine (überhaupt keine) Garantie dafür, dass der Prozess bei diesem PID derselbe oder auch nur ähnlich ist.