2012-07-28 69 views
0

*/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命令似乎在执行,即使l is正在写入apartments.txt,我看不到原因。这是正确的用法假设我试图防止从lynx/grep写入到它的时候从apartments.txt读取?谢谢!

回答

2

您的用法错误。请注意你的第一个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 

这种方法的缺点是:lynxgrep运行,即使文件被锁定。为了防止这种情况,你必须将锁下运行整个事情:

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

使用这种方法,你将不得不小心注意引用作为山猫的URL参数,因为它需要双引号。

最后:考虑使用curlwget而不是lynxlynx是为交互式使用!