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

这是一项计划任务。即使 lynx 正在写入 apartments.txt,第二行 php 命令似乎也在执行,我看不出原因。假设我在 lynx/grep 正在写入时试图阻止从 apartments.txt 中读取,这是正确的用法吗?谢谢!

4

1 回答 1

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 参数,因为它需要双引号。

最后:考虑使用curlorwget代替lynx. lynx用于交互式使用!

于 2012-07-30T19:22:44.667 回答