우리 애플리케이션에서는 몇 가지 백그라운드 프로세스를 시작합니다. 이러한 프로세스의 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