如何在Ubuntu上通过crontab运行py脚本?

时间:2019-12-13 18:58:23

标签: python

这里我有用于通过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()

2 个答案:

答案 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