Как проверить, является ли процесс с 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/какой-диапазон-pid-на-linux-и-solaris

Я опубликую свое текущее решение. Мне бы хотелось узнать, разумный ли это подход и есть ли лучшие способы сделать это.

решение1

Я создал следующее решение для этого

Мой стартовый скрипт содержит

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

Мой скрипт остановки считывает pid-файл и проверяет, соответствует ли 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

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