قطيع الاستخدام الصحيح لمنع القراءة أثناء الكتابة
سؤال
*/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 بالكتابة عليه؟شكرًا!
المحلول
استخدامك غير صحيح.لاحظ كيف أن مهمة 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
عيب هذا النهج هو ذلك lynx
و grep
تشغيل حتى لو كان الملف مقفلا.لمنع ذلك، سيتعين عليك تشغيل الأمر برمته تحت القفل:
flock -x -w 10 /tmp/craigslock.lock sh -c "lynx etc... | grep etc... >thefile"
باستخدام هذا الأسلوب، سيتعين عليك الاهتمام جيدًا بالاقتباس باعتباره وسيطة URL الخاصة بـ lynx، حيث سيتطلب ذلك اقتباسًا مزدوجًا.
أخيراً:فكر في استخدام curl
أو wget
بدلاً من lynx
. lynx
والمقصود للاستخدام التفاعلي!