2016-07-01 8 views
0

私はcrontabでpythonスクリプトを実行しようとしています。 crontabファイルが呼び出されるとlocal()を会議中にpythonスクリプトを実行できませんでした

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 ...') 
...... 

、ログファイルのようなある:

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

Pythonスクリプトは、以下のようなものである

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 

そして、プロセスは終了します。私はそれを見つけることができませんps -ef|grep python

local()の間に終わるのはなぜですか?

+2

cronから実行されるものはすべて、最小限の環境で実行されるため、調整されたPYTHONPATHを使用することに頼っているのであれば、それはおそらく理由です。 – Vatine

+0

シェルから/ home/hadoop/hadoop/bin/hadoop fs -put /data/uxin/nsq_client_active_collect/hadoop/openappfinal.log/user/hadoop/yunying/openappコマンドを起動しようとしましたか?それは正しいユーザーのcrontabに設定されていますか?権限の問題はありますか? – BangTheBank

答えて

0

PYTHONPATHは、CRONがスクリプトを実行するために使用しているユーザーであれば、正しく設定されていない可能性があります。行追加

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

試してみてください:チェックするために、デバッグファイルへのパスをプリントアウトローカル

をインポートする前に

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

をあなたはまた、動的にされているファイルの場所を取得することができます

import os 
os.path.realpath(__file__) 

これにより、必要な場合に相対パスを使用できるようになります。 em

+0

問題が見つかりました。 'local()'ではなく、 'hadoop fs -put'コマンドを実行中にJAVA_HOMEが設定されていません。ありがとうございます! –

関連する問題