LINUX.ORG.RU

Race conditions в shell


0

0

Приветствую всех!

Подскажите, как обычно решаются проблемы с гонками в shell?
У меня один и тот же скрипт стартует два раза через небольшой интервал времени, в итоге иногда вылезают проблемы в критической секции.
Пока единственная идея - написать функции lock и unlock, которые будут работать через файлы типа /var/lock/blablabla.

★★★★

в *BSD есть shlock(1), в линуке flock(1)

Еще можно оставаясь в пределах позикса с помощью mv залочиться

dilmah ★★★★★
()

Вполне себе нормальное решение. Я обычно так и делаю. Точнее говоря, для задачи «проверить, не работает ли еще один экземпляр скрипта» вместо пустых лок-файлов по возможности использую PID-файлы - так удобнее, имхо.

А вообще локи можно размещать где угодно, ходь в базе данных.

anonymous
()
Ответ на: комментарий от dilmah

>в *BSD есть shlock(1), в линуке flock(1)

Спасибо!
Да, flock - самое подходящее решение,
правда этой утилиты нет на target платформе, на которой будет запускаться скрипт. Если реализация с файлами в /var/lock будет плохо работать, то втащу flock.

Еще можно оставаясь в пределах позикса с помощью mv залочиться

Что-то совсем не понял. Можете разъяснить?

Dead ★★★★
() автор топика
Ответ на: комментарий от Dead

если сделать просто:

#!/bin/sh
LOCKFILE=/var/lock/mylock
if test -f $LOCKFILE; then
exit 1
fi
touch $LOCKFILE
# do useful work

то это понятно race condition.

Чтобы избежать race condition нужен какой-то внешний арбитр. В качестве него можно взять ОС и команды типа mv или ln, которые гарантировано выполняются атомарно (если в пределах одной ФС).

Например:

#!/bin/sh
LOCKFILE=/var/lock/mylock
touch ${LOCKFILE}.$$
if ! ln ${LOCKFILE}.$$ ${LOCKFILE} 2> /dev/null; then
rm -f ${LOCKFILE}.$$
exit 1
fi
trap 'rm -f ${LOCKFILE} ${LOCKFILE}.$$' INT QUIT TERM EXIT
# do useful work

dilmah ★★★★★
()

man 1 flock, пакет lockfile-progs, во фряхе есть прога lockf итп...

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.