правильное использование, чтобы предотвратить чтение во время записи

StackOverflow https://stackoverflow.com//questions/11705393

  •  13-12-2019
  •  | 
  •  

Вопрос

*/10 * * * * /usr/bin/flock -x -w 10 /tmp/craigslist.lock /usr/bin/lynx -width=120 -dump "http://sfbay.craigslist.org/search/roo/sfc?query=&srchType=A&minAsk=&maxAsk=1100&nh=6&nh=8&nh=16&nh=24&nh=17&nh=21&nh=22&nh=23&nh=27" | grep "sort by most recent" -A 53 > /home/winchell/apartments.txt

*/10 * * * * /usr/bin/flock -x -w 10 /tmp/craigslist.lock /usr/bin/php /home/winchell/apartments.php

Это работа cron.Вторая строка php-команды, похоже, выполняется, даже когда lynx записывает данные в файл apartment.txt, и я не вижу причины.Правильно ли это использование, если предположить, что я пытаюсь предотвратить чтение из файла apartment.txt, пока в него пишут lynx/grep?Спасибо!

Это было полезно?

Решение

Ваше использование неверно.Обратите внимание, что ваше первое задание cron представляет собой конвейер, состоящий из двух команд:

/usr/bin/flock -x -w 10 /tmp/craigslist.lock /usr/bin/lynx -width=120 -dump
    "http://sfbay.craigslist.org/search/roo/sfc?query=&srchType=A&minAsk=&maxAsk=1100&nh=6&nh=8&nh=16&nh=24&nh=17&nh=21&nh=22&nh=23&nh=27"

который затем передается по каналу:

grep "sort by most recent" -A 53 > /home/winchell/apartments.txt

Итак, первая команда блокирует файл, а вторая команда записывает в этот файл!Вторая команда успешно выполнится, не дожидаясь блокировки.

Один из способов исправить это — записать файл, удерживая блокировку:

lynx etc... | grep etc.. |
    flock -x -w 10 /tmp/craigslist.lock tee /home/winchell/apartments.txt

Недостаток этого подхода в том, что lynx и grep запускаться, даже если файл заблокирован.Чтобы этого не произошло, вам придется запускать все это дело под блокировкой:

flock -x -w 10 /tmp/craigslock.lock sh -c "lynx etc... | grep etc... >thefile"

При таком подходе вам придется уделять пристальное внимание кавычкам в качестве аргумента URL-адреса lynx, поскольку для этого потребуется двойное кавычество.

Окончательно:рассмотрите возможность использования curl или wget вместо lynx. lynx предназначен для интерактивного использования!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top