Как избежать проблем с одновременным доступом? (если они будут, конечно) (perl apache)

Модератор: Модераторы разделов

Аватара пользователя
Failed
Сообщения: 13
ОС: Debian

Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение Failed »

Приветствую!
Не знаю где именно нужно было откывать подобную тему, поэтому напишу тут )
Я только начинаю работать с чем-то сложнее винампа и веб браузера, поэтому заранее прошу прощения, если вопрос окажется настолько тупым что оскорбит ваши чувства )

Итак есть:

1) Debian eth.
2) Apache
3) А теперь самое главное:
через крон каждую минуту запускается скрипт на перле, который:

а. запускает внешнюю программу перенаправляя ее вывод во временный файл
б. ждет пока она завершится
в. открывает временный файл с выводом внешней программы на чтение и файл куда будет писаться результат для записи (в моем случае это /var/www/rep.html )
в. построчно читает временный файл, разбирает вывод, и записывает видоизмененную строку в файл с результатом
г. закрывает оба файла.

После выполнения у меня появляется нужная мне страница, доступная к загрузке через веб (так как она лежит сразу в документрут апача)
Вся эта штука мною уже побеждена, и работает.
Но не дает покоя такой вопрос:
а что будет, если кто-то попытается загрузить страницу в тот момент, когда она еще будет не готова (ну тоесть она на тот момент будет еще генерироваться, и файл не будет закрыт)?


Застать такой момент мне не удалось, но паранойя победила )), и я изменил скрипт так, что результат генерируется во временный файл, который
в последний момент копируется в директорию апача.
Но теперь проскакивает такая мысль - а что будет если к странице обратятся в момент когда она будет только копироваться? )))) Апач подождет, или даст отбой?

Вобщем, имеет ли мне смысл волноваться по этому поводу, или линукс "сам все разрулит"? ))
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение rm_ »

а что будет если к странице обратятся в момент когда она будет только копироваться? ))))

Используйте не копирование, а атомарную в пределах одной ФС операцию - move (mv). "Недопереименованным" файл быть не может. :)
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение watashiwa_daredeska »

rm_ писал(а):
28.01.2009 11:31
Используйте не копирование, а атомарную в пределах одной ФС операцию - move (mv). "Недопереименованным" файл быть не может. :)
mv не атомарна, т.к. при переименовании файла в уже существующий выполняется два атомарных действия: unlink, link. Однако, период времени, в течение которого rep.html будет недоступен, довольно мал, на порядки меньше, чем при копировании содержнмого.
Спасибо сказали:
Аватара пользователя
Failed
Сообщения: 13
ОС: Debian

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение Failed »

Спасибо за советы!

В связи с этим, возникла такая мысль:

а что если сделать так - клиенты будут обращаться не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл (как-то ведь можно узнать можно ли читать файл или нет?), и если нет то делать задержку на пару миллисекунд и пробовать снова.
или вообще тупо - скрипт будет пробовать открыть файл на чтение, и в случае ошибки опятьже ждать немного и пробовать еще раз..

С первым вариантом я не представляю как делать, а тупой способ, как я понимаю, будет выглядеть как-нибудь так:

Код:

while (!open(RepFile, '/var/www/rep.html') ) { sleep (0.2); } ... а дальше уже работа с самим файлом


Такое допустимо?

upd: Так, со скриптом я, видимо, накосячил.. но суть понятна, надеюсь )
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение watashiwa_daredeska »

Failed писал(а):
28.01.2009 12:31
а что если сделать так - клиенты будут обращаться не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл
Это будет правильнее. Однако, нужно учитывать нагрузку -- отдать статический файл гораздо проще, нежели гонять скрипт, особенно если это обычный CGI.

Failed писал(а):
28.01.2009 12:31
(как-то ведь можно узнать можно ли читать файл или нет?), и если нет то делать задержку на пару миллисекунд и пробовать снова.
или вообще тупо - скрипт будет пробовать открыть файл на чтение, и в случае ошибки опятьже ждать немного и пробовать еще раз..
Есть более-менее отработанные методы предотвращения одновременного доступа (File locking), однако они требуют поддержки от всех участников процесса: и читателей, и писателей.
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение minoru-kun »

а. запускает внешнюю программу перенаправляя ее вывод во временный файл
б. ждет пока она завершится
в. открывает временный файл с выводом внешней программы на чтение и файл куда будет писаться результат для записи (в моем случае это /var/www/rep.html )

Рекомендую прочитать про popen, это совсем несложно.
После выполнения у меня появляется нужная мне страница, доступная к загрузке через веб (так как она лежит сразу в документрут апача)

Рекомендую прочитать про CGI Perl, это ненамного сложнее, чем popen.
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)

Сообщение rm_ »

mv не атомарна, т.к. при переименовании файла в уже существующий выполняется два атомарных действия: unlink, link. Однако, период времени, в течение которого rep.html будет недоступен, довольно мал, на порядки меньше, чем при копировании содержнмого.

Точно. Спасибо. :)

не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл

Можно, но вариант с mv лично мне нравится больше.
Спасибо сказали: