pid X를 사용한 프로세스가 예상한 프로세스인지 확인하는 방법

pid X를 사용한 프로세스가 예상한 프로세스인지 확인하는 방법

우리 애플리케이션에서는 몇 가지 백그라운드 프로세스를 시작합니다. 이러한 프로세스의 pid는 파일에 저장됩니다.

pids 값은 최대값에 도달하거나 시스템이 재부팅될 때 재사용됩니다.

pid X가 있는 프로세스가 여전히 X가 저장된 프로세스와 동일한지 어떻게 확실하게 확인할 수 있습니까?

나는 읽었다 https://serverfault.com/questions/366474/whats-a-proper-way-of-checking-if-a-pid-is-running 그리고https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists 그러나 이러한 솔루션은 pid X가 있는 프로세스가 pid가 저장된 프로세스와 여전히 동일한 프로세스인지 확인하지 않습니다.

안정적으로 수행하려면 이 정보가 필요합니다.

  • 프로세스가 아직 실행 중인지 확인하세요.
  • 현재 pid X가 있는 다른 프로세스를 종료할 위험 없이 프로세스를 종료합니다.

관련된https://serverfault.com/questions/279178/what-is-the-range-of-a-pid-on-linux-and-solaris

현재 솔루션을 게시하겠습니다. 이것이 합리적인 접근 방식인지, 더 나은 방법이 있는지 알고 싶습니다.

답변1

이에 대해 다음 솔루션을 만들었습니다.

내 시작 스크립트에는 다음이 포함되어 있습니다.

nohup $commandline >> $TEMP/logfile 2>&1 &
MYPID=$!
echo $MYPID > pidfile
cat /proc/$MYPID/cmdline >> pidfile

내 중지 스크립트는 pidfile을 읽고 cmdline이 원래 저장된 것과 일치하는지 확인합니다.

[ -f pidfile ] || { echo no pidfile; exit 1; }
read pid < pidfile
psatstart=$(tail -1 pidfile)
psnow=$(</proc/$pid/cmdline)

if [[ "$psnow" == "$psatstart" ]]
then
    echo kill $pid
    kill $pid || { echo kill $pid failed; exit 2; }
    while ps -p $pid
    do
        sleep 1
    done
else
    echo pid $pid not the same, assume already ended
    echo S $psatstart
    echo N $psnow
fi
rm pidfile

관련 정보