奇妙なpythonスクリプトでエンコーディングエラーを記録し、crontabはエラーを実行しますが、手動で正常に実行します.

2900 ワード

一、背景
pythonスクリプトでアリクラウドのOSSストレージバケツに画像をアップロードします.
二、環境
群暉ストレージデバイスは、crontabコマンドがなく、タイミングタスクを構成するにはユーザーを指定する必要があります.
オペレーティングシステム:Linux RackStation 3.10.102#15101 SMP Fri Apr 28 02:48:03 CST 2017 x 86_64 GNU/Linux synology_broadwell_rs18017xs+
三、エラーメッセージ
Traceback (most recent call last):

File "/volume1/scripts/backupToOSS.py", line 59, in 

bucket.put_object_from_file(ossName, tfile)

File "/usr/lib/python2.7/site-packages/oss2/api.py", line 380, in put_object_from_file

with open(to_unicode(filename), 'rb') as f:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-10: ordinal not in range(128)


Traceback (most recent call last):

File "/volume1/scripts/backupToOSS.py", line 59, in 

bucket.put_object_from_file(ossName, tfile)

File "/usr/lib/python2.7/site-packages/oss2/api.py", line 380, in put_object_from_file

with open(to_unicode(filename), 'rb') as f:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-10: ordinal not in range(128)

エラーメッセージから見ると、スクリプトでbucketが実行されているはずです.put_object_from_file(ossName,tfile)の場合、/usr/lib/python 2を呼び出します.7/site-packages/oss2/api.pyが間違っています.
四、pythonスクリプト全体
#!/usr/bin/env python

#-*- coding: utf-8 -*-

#Filename: backupToOSS.py

#Author:

#Desc:                  OSS 。


import os

import datetime

import commands

import oss2

import logging

import sys

reload(sys)

sys.setdefaultencoding('utf-8')


#      AccessKeyId、AccessKeySecret、Endpoint   。

#         ,     “”      AccessKeyId 。

#

#        ,Endpoint   :

# http://oss-cn-hangzhou.aliyuncs.com

# https://oss-cn-hangzhou.aliyuncs.com

#    HTTP、HTTPS    。

access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', 'aaaaaaaaaaaaaaaaaa')

access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', 'xxxxxxxxxxxx')

bucket_name = os.getenv('OSS_TEST_BUCKET', 'yyyyyyyy')

endpoint = os.getenv('OSS_TEST_ENDPOINT', 'zzzzzzzzzzzzzzzz')


#              

for param in (access_key_id, access_key_secret, bucket_name, endpoint):

assert '

五、crontab配置
#backup data to Aliyun OSS
30 00 * * * root/bin/bash/volume1/scripts/findWithOSS.sh
30 09 * * * root/bin/python/volume1/scripts/backupToOSS.py
六、怪奇現象
不思議なことに、まったく同じスクリプトでcrontabを使ってタイミングタスクを走ると上のエラーが表示されますが、手動で実行すると全く問題ありません.
nohup python ./backupToOSS.py &
七、原因分析
crontabがスクリプトを実行する場合の環境変数は、rootユーザーとして直接手動で実行する場合とは異なります.
八、解決方法
/etc/crontabファイルにロードコマンドsourceを追加すればいいです.テストを経て、この方法は有効になり、エラーは発生しません.
#backup data to Aliyun OSS
30 00 * * * root/bin/bash/volume1/scripts/findWithOSS.sh
55 10 * * * root source/etc/profile &&/bin/python/volume1/scripts/backupToOSS.py