Флок правильное использование, чтобы предотвратить чтение во время записи
*/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 пишет в apartments.txt, и я не вижу причины. Это правильное использование, если я пытаюсь предотвратить чтение из apartments.txt, пока lynx/grep пишет в него? Спасибо!
1 ответ
Ваше использование не правильно. Обратите внимание, что ваше первое задание 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
предназначен для интерактивного использования!