rebanho uso correto para evitar leitura enquanto escreve
Pergunta
*/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
Este é um trabalho cron.O comando php de segunda linha parece estar em execução mesmo enquanto o lynx está gravando em apartamentos.txt, e não vejo o motivo.Este uso é correto, assumindo que estou tentando impedir a leitura de apartments.txt enquanto o lynx/grep está gravando nele?Obrigado!
Solução
Seu uso não está correto.Observe como seu primeiro cron job é um pipeline que consiste em dois comandos:
/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"
que é então canalizado para:
grep "sort by most recent" -A 53 > /home/winchell/apartments.txt
Portanto, o primeiro comando está bloqueando um arquivo, mas é o segundo comando que está gravando nesse arquivo!O segundo comando será executado sem esperar pelo bloqueio.
Uma maneira de corrigir isso seria gravar o arquivo enquanto segura o bloqueio:
lynx etc... | grep etc.. |
flock -x -w 10 /tmp/craigslist.lock tee /home/winchell/apartments.txt
A desvantagem desta abordagem é que lynx
e grep
execute mesmo se o arquivo estiver bloqueado.Para evitar isso, você terá que executar tudo sob sigilo:
flock -x -w 10 /tmp/craigslock.lock sh -c "lynx etc... | grep etc... >thefile"
Com esta abordagem, você terá que prestar muita atenção às citações como argumento de URL do lynx, pois isso exigirá aspas duplas.
Finalmente:considere usar curl
ou wget
em vez de lynx
. lynx
destina-se ao uso interativo!