Это хрупкий механизм.Я предпочитаю использовать реальные блокировки файлов, поэтому, когда процесс, которому они принадлежат, умирает, O / S автоматически снимает блокировку.Это легко сделать в perl (используя функцию flock), но я не знаю, возможно ли это в Bash.
Более того, я полагаю, вы могли бы использовать сам файл блокировки для хранения PID скриптаудерживая блокировку, верно?
(я не слишком много пишу сценариев оболочки ... я думаю, что приведенный ниже код в основном правильный, но используйте на свой страх и риск. Существуют условия гонки.)
while [[ lockfile -! -r 0 lock.file ]]
do
kill -0 `cat lock.file`
if [[ $? -ne 0 ]]
then
# process doesn't exist anymore
echo $$ >lock.file
# do something important
rm -f lock.file
break
fi
sleep 5
done
Или как на счет этого:
while [[ true ]]
do
if [[ ! -e pid.file ]]
then
echo $$ > pid.file
else
if [[ kill -0 `cat pid.file`]]
then
# owner process exists
sleep 30
else
# process gone, take ownership
echo $$ > pid.file
# ### DO SOMETHING IMPORTANT HERE ###
rm -f pid.file
break
fi
fi
done
Мне больше нравится второй.Это все еще далеко от совершенства (много условий гонки), но это может сработать, если не слишком много процессов, борющихся за блокировку.Кроме того, сон 30 должен включать в себя некоторую случайность, если это возможно (длина сна должна иметь случайную составляющую).
Но смотрите здесь, похоже, что вы может использовать flock с некоторыми версиями оболочки .Это было бы похоже на то, что я делаю в Perl, и это было бы безопаснее, чем альтернативы, которые я могу придумать.