这里我有用于通过optipng优化png文件的python脚本。
我想添加crontab作业以每小时运行一次,以检查wp-content目录中最近一个小时添加的新文件。
如果我通过bash本身运行脚本,则会优化所有文件。 如果我将optimize_all更改为cron_job-即使我刚刚上传了新的PNG文件,也没有任何反应。
对不起,我对Python不熟悉,想知道如何修复cron_job函数(如果它对我的目的不正确)或如何正确安排此函数运行
import os
import time
import glob
from subprocess import call
from datetime import datetime, timedelta
from os.path import join, getsize
path = '/var/www/html/wp-content'
DELETE_OLD_DAYS = 3
def get_old_dates(days=0):
for day in range(0, days):
yield datetime.now() - timedelta(days=day)
def cron_job():
for dat in get_old_dates(DELETE_OLD_DAYS):
dir_name = '%s/%s' % (path, dat.strftime('%Y/%m'))
try:
for filename in os.listdir(dir_name):
info = os.stat('%s/%s' % (dir_name, filename))
# get modified time.
tim = time.localtime(info.st_mtime)
if tim.tm_year == dat.year and tim.tm_mon == dat.month and tim.tm_mday == dat.day:
print tim.tm_year, dat.year, " ", tim.tm_mon, dat.month, " ", tim.tm_mday, dat.day
file_path = '%s/%s' % (dir_name, filename)
print file_path
ext = file_path.split('.')[-1].upper()
if ext in ["PNG"]:
call(["optipng", "-strip all", "-quiet", "-keep", file_path])
call(["chown", "www-data:www-data", file_path])
call(["chmod", "664", file_path])
old = int((dat - timedelta(days=DELETE_OLD_DAYS + 1)).strftime('%s'))
os.utime(file_path, (old, old))
except OSError as ex:
# print ex
pass
def optimize_all():
for dp, dn, filenames in os.walk(path):
for fil in filenames:
file_path = os.path.join(dp, fil)
print file_path
ext = file_path.split('.')[-1].upper()
if ext in ["PNG"]:
call(["optipng", "-strip all", "-quiet", "-keep", file_path])
call(["chown", "www-data:www-data", file_path])
call(["chmod", "664", file_path])
cron_job()
答案 0 :(得分:1)
如果使用@Sukumar的答案设置自己的作业,请小心。
他的cron作业将每天运行一次。
您需要的是:0 * * * *-这表示每月的每一天中的每一小时,只有在该小时的开始时
整个cron作业可以设置为:
0 * * * * python3 /path_to_your_script/your_script.py
但是,如果您的脚本依赖于从特定目录中抓取文件,则将导致问题。
一种更安全的方法是:
0 * * * * cd/path_to_your_script && python your_script.py
那样,我们在scripts文件夹中工作,而不是在相对路径上执行它。
答案 1 :(得分:0)
我建议您做一些您在这里没有做过的事情。
将所有需要在主函数中运行的代码包含在内,并具有
__name__=='__main__'
块,直接运行脚本时将通过该块执行代码。
所有这些都放在一个python脚本中。
尝试在需要时安排cron作业。您可以在此处检查cron格式-https://crontab.guru/
执行以下操作:
* * * * * /usr/bin/python3 /home/path_to_your_script.py