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ジョブです。2 行目の php コマンドは、lynx が apartments.txt に書き込んでいる間も実行されているように見えますが、その理由はわかりません。lynx/grep がそれに書き込みを行っている間に、partments.txt からの読み取りを防止しようとしていると仮定すると、これは正しい使用法ですか? ありがとう!

4

1 に答える 1

2

あなたの使い方は正しくありません。最初の cron ジョブが、次の 2 つのコマンドで構成されるパイプラインであることに注意してください。

/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

したがって、最初のコマンドはファイルをロックしていますが、そのファイルに書き込むのは 2 番目のコマンドです! 2 番目のコマンドは、ロックを待たずに問題なく実行されます。

これを修正する 1 つの方法は、ロックを保持しながらファイルを書き込むことです。

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 に答える