2016-07-01 22 views
0

Ich versuche, ein Python-Skript in Crontab auszuführen.Python-Skript-Ausführung in crontab fehlgeschlagen während lokale treffen()

5 0 * * * python /home/hadoop/import_openapp.py >> /home/hadoop/openapp.out 2>&1 

Das Python-Skript ist so etwas wie unten:

import sys 
import datetime 
from fabric.api import local 

ystd = datetime.date.today() - datetime.timedelta(days=1) 
c = ystd.strftime('%Y-%m-%d') 
print(c) 
print('Start to format file ...') 
...... 
print('Start to upload on HDFS ...') 
local("/home/hadoop/hadoop/bin/hadoop fs -put " + finalfile + " /user/hadoop/yunying/openapp") 
print('Start to upload on MaxCompute ...') 
...... 

Wenn die crontab aufgerufen wird, die Protokolldatei ist wie:

2016-07-01 
Start to format file ... 
Start to upload on HDFS ... 
[localhost] local: /home/hadoop/hadoop/bin/hadoop fs -put /data/uxin/nsq_client_active_collect/hadoop/openappfinal.log /user/hadoop/yunying/openapp 

Und dann wird der Prozess vorbei ist. Ich kann es nicht finden in ps -ef|grep python

Warum kommt es zu einem Ende beim Treffen local()?

+2

Alles, was von Cron ausgeführt wird, wird mit einer ziemlich minimalen Umgebung ausgeführt, also wenn Sie sich auf einen optimierten PYTHONPATH verlassen, ist das wahrscheinlich der Grund. – Vatine

+0

Haben Sie versucht, den Befehl/home/hadoop/hadoop/bin/hadoop fs -put /data/uxin/nsq_client_active_collect/hadoop/openappfinal.log/user/hadoop/yunying/openapp von der Shell zu starten? Wird Cron auf die Crontab des Benutzers gesetzt? Irgendwelche Berechtigungsprobleme? – BangTheBank

Antwort

0

Es ist wahrscheinlich, dass der PYTHONPATH für den Benutzer, den CRON zum Ausführen des Skripts verwendet, nicht richtig eingerichtet ist. Drucken Sie den Pfad zu einer Debug-Datei zu überprüfen:

with open('/path/to/debug_file.txt', 'wt') as f: 
    f.write(str(sys.path)) 

Versuchen Sie, die Zeile hinzufügen:

sys.path.append("/path/to/fabric.api") 

vor lokalen

Import können Sie auch dynamisch die Position der Datei erhalten, die sein wird, run using

import os 
os.path.realpath(__file__) 

Dies ermöglicht Ihnen, relative Pfade zu verwenden, wenn Sie th. benötigen em

+0

Ich habe das Problem gefunden. Nicht das 'local()', aber JAVA_HOME wird nicht gesetzt, während 'hadoop fs -put' ausgeführt wird. Danke! –