無効な PID 仮定を証明するにはどうすればよいでしょうか?

無効な PID 仮定を証明するにはどうすればよいでしょうか?

多くのプログラマーは満足しているようだPIDをファイルに保存する、そして後で PID を読み取って、それが同じプロセスであることが保証されているかのように使用します。一般的な考え方は、その可能性は無視できるほど高いということのようです。この問題を簡単に実証するにはどうすればよいでしょうか? 理想的には、既存のシェル スクリプトを適応させて、最小限の試行錯誤でこれを実証できるような方法です。

ダミーの例:

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

答え1

使用はexecPID 再利用の非常に良いデモンストレーションです:

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

このスクリプトを実行すると、次のような結果になります。

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

任意のプログラムを実行できるexecため、その PID のプロセスが同じ、または類似しているという保証はまったくありません。

関連情報