web-dev-qa-db-ja.com

Python cronから実行した場合、スクリプトはデータを書き込みません

ターミナルでpythonスクリプトを実行すると、期待どおりに実行されます。ファイルをダウンロードし、目的の場所に保存します。

Sudo python script.py    

ルートcrontabにpythonスクリプトを追加しましたが、ファイルを書き込まないことを除いて、想定どおりに実行されます。

$ Sudo crontab -l
> * * * * * python /home/test/script.py >> /var/log/test.log 2>&1

以下は、まだ問題がある単純化されたスクリプトです。

#!/usr/bin/python

scheduleUrl = 'http://test.com/schedule.xml'
schedule = '/var/test/schedule.xml'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import traceback
        logging.exception('generic exception: ' + traceback.format_exc())
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

「writing:name of file;」というメッセージが表示されます。 cronエントリが出力するログ内。しかし、実際のファイルはどこにも見つかりません...

Dir/var/testは777にchmoddedされ、どのユーザーを使用しても、必要に応じてファイルを追加および変更できます。

7
Ruud
  • ログファイルの確認grep -i cron /var/log/syslog
  • Crontabの最後に空の行を追加します。これは古くから既知のバグであり、解決するかどうかはわかりません。
  • 設計どおりに機能するまで、コマンドラインから2>&1を削除します。有用なエラーは、作成されていないファイルにリダイレクトされます。事実上失われた。
  • ルートがメールを受信したかどうかを確認します(例:muttまたは/var/spool/mailを使用)。デフォルトでは、cronからのエラーメッセージはシステムの電子メールに送信されます。

また:

  • できるだけ早く777許可を再検討してください。ルートから実行する場合、非特権ユーザーからのログを確認するには、755 root:rootで十分です)
  • ルートからスクリプトを実行することを再検討してください、それは悪い練習です。
3
jippie

私のために働くもの

クロンタブ

#Borrowed from anacron
Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   python /home/username/somedir/test.py

Pythonスクリプト

scheduleUrl = 'http://example.com/index.html'
schedule = '/tmp/test.html'

# Download url and save as filename
def wget(url, filename):
    import urllib2
    try:
        response = urllib2.urlopen(url)
    except Exception:
        import logging
        logging.exception('error')
    else:
        print('writing:'+filename+';')
        output = open(filename,'wb')
        output.write(response.read())
        output.close()

# Download the schedule
wget(scheduleUrl, schedule)

環境変数を追加しました。 varの代わりにtmpを使用して、アクセス許可の問題がないことを確認しました。

1
RobotHumans

同様の問題がありました:

f = open('./my_file.txt', 'w')
f.close()

Cronから実行したときにファイルを開いたり書き込んだりしていませんでした。これで解決しました

f = open('<full_path_of_file>/my_file.txt', 'w')
f.close()
0
Luis Miguel

私にとって解決策は、ファイルアクセスモードを変更するのと同じくらい簡単でした。の代わりに:

output = open(filename,'wb')

試してください:

output = open(filename,'rb+')

これを使用して、求人情報のクレイグリストをスクレイプし(自分用)、データベースにモデル化しました。すべてラズベリーパイで行われます。

私はこれを見つけました、そして、それは私が持っていた問題に非常に似ています、しかし、私はここから私の答えを全く得ませんでした。 cronジョブは実行されていましたが、pythonスクリプトは、cronジョブを介して実行されたときにファイルを書き込みませんでした。スクリプトは、コマンドラインから実行された場合、Webスクレイピングテキストファイルを書き込みます。

私にとっての解決策は、単にwbからrb+rb+でした。バイナリ形式で読み取りと書き込みの両方のためにファイルを開きます。ファイルの先頭に配置されたファイルポインター。

0
Andrew Sychra