奇妙なpythonスクリプトでエンコーディングエラーを記録し、crontabはエラーを実行しますが、手動で正常に実行します.
一、背景
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+
三、エラーメッセージ
エラーメッセージから見ると、スクリプトでbucketが実行されているはずです.put_object_from_file(ossName,tfile)の場合、/usr/lib/python 2を呼び出します.7/site-packages/oss2/api.pyが間違っています.
四、pythonスクリプト全体
五、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
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