python don';如果从cron作业执行,则不会写入文件
我编写了一个python脚本,从google analytics API获取一些数据,然后将这些值写入webroot文件夹中的JSON文件。我的脚本运行正常,直接执行或通过./analytics.py执行时会写入JSON文件。我在Ubuntu 18.04上 我通过以下方式使其可执行:python don';如果从cron作业执行,则不会写入文件,python,linux,python-3.x,ubuntu,cron,Python,Linux,Python 3.x,Ubuntu,Cron,我编写了一个python脚本,从google analytics API获取一些数据,然后将这些值写入webroot文件夹中的JSON文件。我的脚本运行正常,直接执行或通过./analytics.py执行时会写入JSON文件。我在Ubuntu 18.04上 我通过以下方式使其可执行: chmod +x analytics.py 并在我的代码开头添加了shebang: #!/usr/bin/env python3 我的crontab-e条目如下所示: 45 17 * * * /root/das
chmod +x analytics.py
并在我的代码开头添加了shebang:
#!/usr/bin/env python3
我的crontab-e条目如下所示:
45 17 * * * /root/dashboard_scripts/analytics.py
tail-f/var/log/syslog的输出如下:
Apr 17 15:44:01 gs-kpi cron[62390]: (root) RELOAD (crontabs/root)
Apr 17 15:45:01 gs-kpi CRON[63978]: (root) CMD (/root/dashboard_scripts/analytics.py)
我还使用一个示例cron检查了cron是否在用户根目录下运行
我的python脚本如下所示:
#!/usr/bin/env python3
import argparse
import json
import re
import os
import pprint
from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools
save_path = '/var/www/html/'
filename = 'googleanalytics_data.json'
data = []
SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest')
KEY_FILE_LOCATION = '543671d681ee.p12'
SERVICE_ACCOUNT_EMAIL = 'data-gserviceaccount.com'
VIEW_ID = '10'
def initialize_analyticsreporting():
"""Initializes an analyticsreporting service object.
Returns:
analytics an authorized analyticsreporting service object.
"""
credentials = ServiceAccountCredentials.from_p12_keyfile(
SERVICE_ACCOUNT_EMAIL, KEY_FILE_LOCATION, scopes=SCOPES)
http = credentials.authorize(httplib2.Http())
# Build the service object.
analytics = build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)
return analytics
def get_report(analytics):
# Use the Analytics Service Object to query the Analytics Reporting API V4.
return analytics.reports().batchGet(
body={
'reportRequests': [
{
'viewId': VIEW_ID,
'dateRanges': [
{'startDate': '7daysAgo', 'endDate': 'yesterday'},
{'startDate': '14daysAgo', 'endDate': '8daysAgo'},
],
'metrics': [
{'expression': 'ga:pageviews'},
{'expression': 'ga:sessions'},
{'expression': 'ga:pageviewsPerSession'},
{'expression': 'ga:bounces'},
{'expression': 'ga:users'},
{'expression': 'ga:newUsers'},
{'expression': 'ga:goal7Starts'},
{'expression': 'ga:avgPageLoadTime'}
],
"orderBys": [
{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}
]
}
]
}
).execute()
def print_response(response):
"""Parses and prints the Analytics Reporting API V4 response"""
for report in response.get('reports', []):
columnHeader = report.get('columnHeader', {})
dimensionHeaders = columnHeader.get('dimensions', [])
metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
rows = report.get('data', {}).get('rows', [])
for row in rows:
dimensions = row.get('dimensions', [])
dateRangeValues = row.get('metrics', [])
for header, dimension in zip(dimensionHeaders, dimensions):
data.append ( header + ': ' + dimension )
for i, values in enumerate(dateRangeValues):
data.append ('Date range (' + str(i) + ')' )
for metricHeader, value in zip(metricHeaders, values.get('values')):
data.append ( metricHeader.get('name') + ': ' + value )
def main():
analytics = initialize_analyticsreporting()
response = get_report(analytics)
print_response(response)
keys = []
values = []
counter = 0
for item in data:
try:
key = re.search(r'ga:(.*?):', item).group()
value = re.search(r'\d{4,5}', item).group()
counter +=1
if counter > 7:
keys.append(key + '_7days')
else:
keys.append(key + '_14days')
values.append(value)
except:
pass
ga_dict = dict(zip(keys, values))
# print(ga_dict)
with open(os.path.join(save_path, filename), mode='w') as f:
f.write(json.dumps(ga_dict, indent=2))
if __name__ == '__main__':
main()
它可能以不同的用户(非root用户)身份运行,具有不同的权限(可能无法访问文件夹),具有不同的环境(变量)。如果它不是以
root用户身份运行,它可能没有/var/www/html
的写访问权限。您应该在邮箱中获得错误输出。使用…analytics.py 2>&1>/tmp/analytics.log
扩展crontab-e条目。如果有,请阅读日志输出。我没有向日志写入任何内容,因为我说过cron也在root下运行,请使用whoami to logfile检查它。请注意,cron作业不会自动获得交互式shell设置的相同环境。例如,您的shell可能执行了/etc/profile、~/.profile、~/.bashrc等。如果这些脚本中的任何一个定义了环境变量或执行了python程序所需的其他初始化(例如,更改ulimit设置),则该程序在通过cron运行时可能无法正常运行。它可能以不同的用户(而不是root)身份运行,使用不同的权限(可能无法访问文件夹),使用不同的环境(变量),如果它不以根目录运行,则可能无法对/var/www/html
进行写访问。您应该在邮箱中获得错误输出。使用…analytics.py 2>&1>/tmp/analytics.log
扩展crontab-e条目。如果有,请阅读日志输出。我没有向日志写入任何内容,因为我说过cron也在root下运行,请使用whoami to logfile检查它。请注意,cron作业不会自动获得交互式shell设置的相同环境。例如,您的shell可能执行了/etc/profile、~/.profile、~/.bashrc等。如果这些脚本中的任何一个定义了环境变量或执行了python程序所需的其他初始化(例如,更改ulimit设置),则该程序在通过cron运行时可能无法正常运行。