유효하지 않은 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의 프로세스가 동일하거나 유사하다는 보장은 전혀 없습니다.

관련 정보