В нашем приложении мы запускаем некоторые фоновые процессы. 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