flock正确用法以防止在写入时读取

时间:2012-07-28 23:11:50

标签: file locking mutex flock

*/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

这是一项计划工作。第二行php命令似乎正在执行,即使lynx写入apartments.txt,我也没有看到原因。这是正确的用法,假设我试图阻止从apartments.txt读取而lynx / grep写入它?谢谢!

1 个答案:

答案 0 :(得分: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"

使用这种方法,你必须要特别注意引用作为lynx的URL参数,因为它需要双引号。

最后:考虑使用curlwget代替lynxlynx用于交互式使用!