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

관련 정보