Flock bei korrekter Verwendung, um ein Lesen während des Schreibens zu verhindern
Frage
*/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
Das ist ein Cronjob.Der PHP-Befehl in der zweiten Zeile scheint auch dann ausgeführt zu werden, wenn Lynx in „appartements.txt“ schreibt, und ich sehe den Grund dafür nicht.Geht diese korrekte Verwendung davon aus, dass ich versuche, das Lesen aus „appartments.txt“ zu verhindern, während lynx/grep darauf schreibt?Danke!
Lösung
Ihre Verwendung ist nicht korrekt.Beachten Sie, dass Ihr erster Cron-Job eine Pipeline ist, die aus zwei Befehlen besteht:
/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"
was dann weitergeleitet wird an:
grep "sort by most recent" -A 53 > /home/winchell/apartments.txt
Der erste Befehl sperrt also eine Datei, aber der zweite Befehl schreibt in diese Datei!Der zweite Befehl wird problemlos ausgeführt, ohne auf die Sperre warten zu müssen.
Eine Möglichkeit, dies zu beheben, besteht darin, die Datei zu schreiben, während die Sperre gedrückt bleibt:
lynx etc... | grep etc.. |
flock -x -w 10 /tmp/craigslist.lock tee /home/winchell/apartments.txt
Der Nachteil dieses Ansatzes besteht darin lynx
Und grep
wird auch dann ausgeführt, wenn die Datei gesperrt ist.Um dies zu verhindern, müssen Sie das Ganze unter Verschluss halten:
flock -x -w 10 /tmp/craigslock.lock sh -c "lynx etc... | grep etc... >thefile"
Bei diesem Ansatz müssen Sie sorgfältig auf die Angabe von Anführungszeichen als URL-Argument von Lynx achten, da hierfür doppelte Anführungszeichen erforderlich sind.
Endlich:Erwägen Sie die Verwendung curl
oder wget
anstatt lynx
. lynx
ist für die interaktive Nutzung gedacht!