2013-06-21 6 views
14

Ich möchte meine Scrapy Crawler von Cron Job ausführen.Scrapy Crawler in Cron Job

i erstellen bash-Datei getdata.sh wo scrapy Projekt mit seinen Spinnen

#!/bin/bash 
cd /myfolder/crawlers/ 
scrapy crawl my_spider_name 

Meine crontab wie folgt aussieht befindet, möchte ich es in jedem 5 Minuten

*/5 * * * * sh /myfolder/crawlers/getdata.sh 

auszuführen, aber es funktioniert nicht, was ist falsch, wo ist mein Fehler?

, wenn ich meine bash-Datei von Terminal sh ausführen /myfolder/crawlers/getdata.sh es gut funktioniert

Antwort

16

löste ich dieses Problem einschließlich PATH in bash-Datei

#!/bin/bash 

cd /myfolder/crawlers/ 
PATH=$PATH:/usr/local/bin 
export PATH 
scrapy crawl my_spider_name 
+0

+1 Hatte das gleiche Problem und konnte es einfach nicht herausfinden. Sie sollten Ihre Frage als akzeptierte Antwort markieren. :) – Xethron

+1

Ich denke, PATH sollte nicht immer auf/usr/local/bin gesetzt werden, es hängt davon ab, auf welcher Umgebung und auf welchem ​​Server Sie sich befinden, richtig? Also, worauf sollte PATH eingestellt werden? Der Ordner von ....? –

0

hat Ihr Shell-Skript über die Berechtigung ausführen?

z.B. Sie tun können,

/myfolder/crawlers/getdata.sh 

ohne sh?

, wenn Sie können, dann können Sie die sh in der Linie in cron Drop

+0

Nein, es schreibt, dass die Berechtigungen verweigert – beka

+0

Sie müssen 'chmod u + x/myfolder/crawlers/getdata.sh', um es ausführen Erlaubnis geben. das ist, was die '#!/bin/bash' Zeile tut - was die erste Zeile in der Datei sein muss – KeepCalmAndCarryOn

+0

ich gebe es Berechtigungen und entfernen Sie" sh "in Crontab, aber es funktioniert immer noch nicht: S – beka

2

Eine weitere Option ist mit einem Shell-Skript und die Kette zu vergessen, die zwei Befehle zusammen direkt im Cronjob. Stellen Sie nur sicher, dass die Variable PATH vor dem ersten Scrapy-Cronjob in der Crontab-Liste gesetzt ist. Run:

crontab -e 

zu bearbeiten und schauen. Ich habe mehrere Scrapy Crawler, die zu verschiedenen Zeiten laufen. Einige alle 5 Minuten, andere zweimal am Tag.

PATH=/usr/local/bin 
    */5 * * * * user cd /myfolder/crawlers/ && scrapy crawl my_spider_name_1 
    * 1,13 * * * user cd /myfolder/crawlers/ && scrapy crawl my_spider_name_2 

Alle Jobs nach der PATH-Variable finden scrapy. Hier wird der erste alle 5 Minuten und der zweite zweimal am Tag um 1 und 1 Uhr laufen. Ich fand das leichter zu verwalten. Wenn Sie andere Binärdateien ausführen müssen, müssen Sie möglicherweise ihre Positionen dem Pfad hinzufügen.

8

Das Hinzufügen der folgenden Zeilen in crontab -e führt meine scrapy Crawl um 5 Uhr jeden Tag. Dies ist eine leicht modifizierte Version der Antwort Crocs

PATH=/usr/bin 
* 5 * * * cd project_folder/project_name/ && scrapy crawl spider_name 

Ohne $PATH Einstellung cron würde mir eine Fehlermeldung ‚Befehl nicht gefunden: scrapy‘. Ich denke, das liegt daran, dass in/usr/bin Skripte zur Ausführung von Programmen in Ubuntu gespeichert sind.

Beachten Sie, dass der vollständige Pfad für mein Scrapy-Projekt /home/user/project_folder/project_name ist. Ich habe den Befehl env in Cron ausgeführt und festgestellt, dass das Arbeitsverzeichnis /home/user ist.Daher übersprungen ich /home/user in meiner crontab oben

Das cron-Protokoll kann hilfreich sein, während

Debuggen
grep CRON /var/log/syslog 
1

Für alle, die pip3 (oder ähnliches) verwendet scrapy zu installieren, hier ist eine einfache Inline-Lösung:

*/10 * * * * cd ~/project/path && ~/.local/bin/scrapy crawl something >> ~/crawl.log 2>&1 

ersetzen:

*/10 * * * * mit Ihrem cron Muster

~/project/path mit dem Pfad zu Ihrem scrapy Projekt (wo Ihre scrapy.cfg ist)

something mit der Spinne Namen (Verwendung scrapy list in Ihrem Projekt, um herauszufinden)

~/crawl.log mit der Protokolldatei Position (im Fall Sie wollen Logging haben)