Приветствую!
Не знаю где именно нужно было откывать подобную тему, поэтому напишу тут )
Я только начинаю работать с чем-то сложнее винампа и веб браузера, поэтому заранее прошу прощения, если вопрос окажется настолько тупым что оскорбит ваши чувства )
Итак есть:
1) Debian eth.
2) Apache
3) А теперь самое главное:
через крон каждую минуту запускается скрипт на перле, который:
а. запускает внешнюю программу перенаправляя ее вывод во временный файл
б. ждет пока она завершится
в. открывает временный файл с выводом внешней программы на чтение и файл куда будет писаться результат для записи (в моем случае это /var/www/rep.html )
в. построчно читает временный файл, разбирает вывод, и записывает видоизмененную строку в файл с результатом
г. закрывает оба файла.
После выполнения у меня появляется нужная мне страница, доступная к загрузке через веб (так как она лежит сразу в документрут апача)
Вся эта штука мною уже побеждена, и работает.
Но не дает покоя такой вопрос:
а что будет, если кто-то попытается загрузить страницу в тот момент, когда она еще будет не готова (ну тоесть она на тот момент будет еще генерироваться, и файл не будет закрыт)?
Застать такой момент мне не удалось, но паранойя победила )), и я изменил скрипт так, что результат генерируется во временный файл, который
в последний момент копируется в директорию апача.
Но теперь проскакивает такая мысль - а что будет если к странице обратятся в момент когда она будет только копироваться? )))) Апач подождет, или даст отбой?
Вобщем, имеет ли мне смысл волноваться по этому поводу, или линукс "сам все разрулит"? ))
Как избежать проблем с одновременным доступом? (если они будут, конечно) (perl apache)
Модератор: Модераторы разделов
-
Failed
- Сообщения: 13
- ОС: Debian
-
rm_
- Сообщения: 3340
- Статус: It's the GNU Age
- ОС: Debian
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
а что будет если к странице обратятся в момент когда она будет только копироваться? ))))
Используйте не копирование, а атомарную в пределах одной ФС операцию - move (mv). "Недопереименованным" файл быть не может.
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
mv не атомарна, т.к. при переименовании файла в уже существующий выполняется два атомарных действия: unlink, link. Однако, период времени, в течение которого rep.html будет недоступен, довольно мал, на порядки меньше, чем при копировании содержнмого.
Мои розовые очки
-
Failed
- Сообщения: 13
- ОС: Debian
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
Спасибо за советы!
В связи с этим, возникла такая мысль:
а что если сделать так - клиенты будут обращаться не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл (как-то ведь можно узнать можно ли читать файл или нет?), и если нет то делать задержку на пару миллисекунд и пробовать снова.
или вообще тупо - скрипт будет пробовать открыть файл на чтение, и в случае ошибки опятьже ждать немного и пробовать еще раз..
С первым вариантом я не представляю как делать, а тупой способ, как я понимаю, будет выглядеть как-нибудь так:
Такое допустимо?
upd: Так, со скриптом я, видимо, накосячил.. но суть понятна, надеюсь )
В связи с этим, возникла такая мысль:
а что если сделать так - клиенты будут обращаться не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл (как-то ведь можно узнать можно ли читать файл или нет?), и если нет то делать задержку на пару миллисекунд и пробовать снова.
или вообще тупо - скрипт будет пробовать открыть файл на чтение, и в случае ошибки опятьже ждать немного и пробовать еще раз..
С первым вариантом я не представляю как делать, а тупой способ, как я понимаю, будет выглядеть как-нибудь так:
Код:
while (!open(RepFile, '/var/www/rep.html') )
{
sleep (0.2);
}
... а дальше уже работа с самим файлом
Такое допустимо?
upd: Так, со скриптом я, видимо, накосячил.. но суть понятна, надеюсь )
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
Это будет правильнее. Однако, нужно учитывать нагрузку -- отдать статический файл гораздо проще, нежели гонять скрипт, особенно если это обычный CGI.
Есть более-менее отработанные методы предотвращения одновременного доступа (File locking), однако они требуют поддержки от всех участников процесса: и читателей, и писателей.
Мои розовые очки
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
а. запускает внешнюю программу перенаправляя ее вывод во временный файл
б. ждет пока она завершится
в. открывает временный файл с выводом внешней программы на чтение и файл куда будет писаться результат для записи (в моем случае это /var/www/rep.html )
Рекомендую прочитать про popen, это совсем несложно.
После выполнения у меня появляется нужная мне страница, доступная к загрузке через веб (так как она лежит сразу в документрут апача)
Рекомендую прочитать про CGI Perl, это ненамного сложнее, чем popen.
-
rm_
- Сообщения: 3340
- Статус: It's the GNU Age
- ОС: Debian
Re: Как избежать проблем с одновременным доступом? (если они будут, конечно)
mv не атомарна, т.к. при переименовании файла в уже существующий выполняется два атомарных действия: unlink, link. Однако, период времени, в течение которого rep.html будет недоступен, довольно мал, на порядки меньше, чем при копировании содержнмого.
Точно. Спасибо.
не к хтмлю напрямую, а к динамическому скрипту, например на томже перле, который перед тем как отдать содержимое rep.html будет мммм, проверять не занят ли файл
Можно, но вариант с mv лично мне нравится больше.