Как продемонстрировать неверные предположения ПИД?

Как продемонстрировать неверные предположения ПИД?

Кажется, многие программисты довольнысохранение PID в файл, а затем позже прочитать и использовать PID, как будто это гарантированно тот же самый процесс. Кажется, общая идея заключается в том, что шансы достаточно хороши, чтобы их игнорировать. Как я могу просто продемонстрировать эту проблему? В идеале таким образом, чтобы существующие скрипты оболочки можно было адаптировать для демонстрации этого с минимальным количеством проб и ошибок.

Фиктивный пример:

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

решение1

Использование exec— довольно хорошая демонстрация повторного использования 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

Запуск этого скрипта даст что-то вроде следующего:

$ ./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 будет тем же самым или даже похожим.

Связанный контент