Criei esse POST com 2 objetivos: Para compartilhar a minha idéia e quem sabe também obter novas maneiras de resolver um pequeno problema.
Problema: Digamos que você tenha que acessar uma URL qualquer (exemplo: http://localhost:3000/coletar ) a cada 15 segundos. Isso rodará um script que irá colher uma série de dados e armazena-los em banco.
Então, se você rodar um comando como este: “curl http://localhost:3000/coletar” a cada 15 segundos, resolveria meu problema. Agora, como fazer isso usando crontab ?
Se você procurar a solução na internet, encontrará algumas boas idéias como fazer um script e com alguns sleeps e um loop interno você não precisa nem de cron:
#!/bin/sh while [ 1 ]; do curl "http://localhost:3000/coletar" sleep 15 done |
Basta rodar esse script, que com um loop eterno, vai rodar o comando de 15 em 15 segundos… Agora você deve estar pensando: “Problema resolvido!” …
Na verdade, não. Os dados precisam ser coletados necessariamente a cada 15 segundos. Isso significa que se por acaso, quando for feito um request, se o servidor demorar pra responder aquela solicitação, isso pode atrasar a próxima coleta, e depois de algum tempo, o atraso só tende a piorar.
Então qual a melhor solução para este problema ?
Como eu preciso coletar a cada 15 segundos sem que uma coleta atrapalhe a outra, acho que a melhor forma de fazer isso foi adicionar no crontab do usuário:
* * * * * curl 'http://localhost:3000/coletar' * * * * * sleep 15 && curl 'http://localhost:3000/coletar' * * * * * sleep 30 && curl 'http://localhost:3000/coletar' * * * * * sleep 45 && curl 'http://localhost:3000/coletar' |
Com isso, os comandos serão executados independentemente a cada 15 segundos…
Então é isso…
Se você conhece alguma forma mais eficiente para fazer isso… Não deixe de compartilhar a sua idéia comigo 😉