【问题标题】:Crontab Jobs didn't execute shell scriptCrontab Jobs 没有执行 shell 脚本
【发布时间】:2013-08-28 17:17:24
【问题描述】:

我正在开发 django-python 项目并坚持使用 django-crontab 进行自动文件备份,代码如下:

在我的 settings.py 中

INSTALLED_APPS = (
.
.
.
'django-crontab',
)

CRONTAB_DJANGO_MANAGE_PATH = '/home/path/to/my/project/manage.py'

CRONJOBS = [
            ('25 15 * * *', 'cd /home/path/to/my/project && /usr/bin/sh myscript.sh'),
        ]

在 myscript.sh 中

#!/bin/sh
set -e
cd /home/path/to/my/project/
exec cp file some_dir/copy_file

我在我的服务器上测试这段代码在 15:25 点运行,但它没有执行 myscript.sh

脚本只是将文件复制到另一个目录(用于备份),我已经在服务器中使用 ./myscript.sh 手动测试,脚本运行良好...

我一直在尝试各种方法,但似乎没有任何效果

我参考了 django-crontab (https://pypi.python.org/pypi/django-crontab/0.5.1) 和这个网站 (https://superuser.com/questions/81262/how-to-execute-shell-script-via-crontab) + http://github.com/kraiz/django-crontab

编辑

我也使用此命令添加了我的 cronjob

python manage.py crontab add

我已经使用这个命令检查了作业是否存在

python manage.py crontab show

工作示例

settings.py

CRONJOBS = [
            # Auto Backup Database everyday at 4 am
            ('0 4 * * *', 'django.core.management.call_command', ['dumpdata', 'myproject'], {'indent': 4, 'use_natural_keys': True}, '> /home/mydirectory/myproject_backup/myproject_backup.json'),
        ]

myproject_backup.json

[
{
    "pk": 1, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "permission", 
        "name": "permission", 
        "app_label": "auth"
    }
},
{
    "pk": 2, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "group", 
        "name": "group", 
        "app_label": "auth"
    }
},
{
    "pk": 3, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "user", 
        "name": "user", 
        "app_label": "auth"
    }
},
{
    "pk": 4, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "contenttype", 
        "name": "content type", 
        "app_label": "contenttypes"
    }
},
{
    "pk": 5, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "session", 
        "name": "session", 
        "app_label": "sessions"
    }
},
{
    "pk": 6, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "site", 
        "name": "site", 
        "app_label": "sites"
    }
},
{
    "pk": 7, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "logentry", 
        "name": "log entry", 
        "app_label": "admin"
    }
},
{
    "pk": 8, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "poll", 
        "name": "poll", 
        "app_label": "polls"
    }
},
{
    "pk": 9, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "choice", 
        "name": "choice", 
        "app_label": "polls"
    }
},
{
    "pk": 10, 
    "model": "contenttypes.contenttype", 
    "fields": {
        "model": "cronjoblog", 
        "name": "cron job log", 
        "app_label": "django_cron"
    }
},
{
    "pk": "1g6s3bly0gu6pn7spllerdw1n8sus08a", 
    "model": "sessions.session", 
    "fields": {
        "expire_date": "2013-09-04T05:48:32Z", 
        "session_data": "YTg4Y2I3OWM3Nzg4NmIyOGE2NmJiZDAxYmYwMGNiYWI3Zjg5OGFmMDqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAQF1Lg=="
    }
},
{
    "pk": "j7ifcyfzfhentb5tx9492fphdf20g2qp", 
    "model": "sessions.session", 
    "fields": {
        "expire_date": "2013-09-11T04:54:37Z", 
        "session_data": "YTg4Y2I3OWM3Nzg4NmIyOGE2NmJiZDAxYmYwMGNiYWI3Zjg5OGFmMDqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAQF1Lg=="
    }
},
{
    "pk": "m21on2le3kti3ezexzei1vpox57x8qgv", 
    "model": "sessions.session", 
    "fields": {
        "expire_date": "2013-09-05T06:29:00Z", 
        "session_data": "YTg4Y2I3OWM3Nzg4NmIyOGE2NmJiZDAxYmYwMGNiYWI3Zjg5OGFmMDqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAQF1Lg=="
    }
},
{
    "pk": "x16t71c19o93kukwu5mvog1g76ynv3ip", 
    "model": "sessions.session", 
    "fields": {
        "expire_date": "2013-09-04T07:07:46Z", 
        "session_data": "YTg4Y2I3OWM3Nzg4NmIyOGE2NmJiZDAxYmYwMGNiYWI3Zjg5OGFmMDqAAn1xAShVEl9hdXRoX3VzZXJfYmFja2VuZHECVSlkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZHEDVQ1fYXV0aF91c2VyX2lkcQSKAQF1Lg=="
    }
},
{
    "pk": 1, 
    "model": "sites.site", 
    "fields": {
        "domain": "example.com", 
        "name": "example.com"
    }
},
{
    "pk": 1, 
    "model": "polls.poll", 
    "fields": {
        "pub_date": "2013-08-21T05:56:00Z", 
        "question": "What are you doing?"
    }
},
{
    "pk": 2, 
    "model": "polls.poll", 
    "fields": {
        "pub_date": "2013-08-21T05:58:00Z", 
        "question": "What's on your mind?"
    }
},
.
.
]

如果有人可以提供帮助,我将不胜感激:S

【问题讨论】:

    标签: django shell python-2.7 crontab


    【解决方案1】:

    在您运行 python manage.py crontab add 之前,您在设置中安排的 cronjobs 不会真正添加到 crontab 中。

    RTD

    【讨论】:

    • 您好 zsquare,感谢您的回答。实际上,我一直在使用该命令来执行另一个 cronjobs 并运行良好。问题是上面的 cronjob 没有执行该作业,而另一个运行良好。也许我错过了一些设置,但我还没有弄清楚:(
    【解决方案2】:

    查看django crontab的格式:

    #format 1
    required: cron timing (in usual format: http://en.wikipedia.org/wiki/Cron#Format)
    required: the python module path to the method
    optional: a job specific suffix (f.e. to redirect out/err to a file, default: '')
    
    #format 2
    required: cron timing (in usual format: http://en.wikipedia.org/wiki/Cron#Format)
    required: the python module path to the method
    optional: list of positional arguments for the method (default: [])
    optional: dict of keyword arguments for the method (default: {})
    optional: a job specific suffix (f.e. to redirect out/err to a file, default: '')
    

    在这两种情况下,您都需要使用 python 方法,而不仅仅是来自 shell 的命令。 你不能写像'cd ...; 。/命令';您应该将此行包装到代码中的 python 模块中。

    更多:

    【讨论】:

    • 嗨,伊戈尔,感谢您的回复。这是同样的事情,我也尝试过......这真的很奇怪,如果我直接使用命令 ./myscript.sh 执行,它工作得很好......问题是关于 django-crontab 的文档的限制(只有这一个-->github.com/kraiz/django-crontab
    • 您能否向 crontab 添加一些虚拟命令,以确保它有效?例如“日期>> /tmp/date.log”,每分钟“* * * * *”?
    • 啊抱歉我的错,我忘了提到我已经在我的 settings.py 中声明了它--> CRONTAB_DJANGO_MANAGE_PATH = '/home/path/to/my/project/manage.py ' 它适用于 dumpdata 命令。
    • 没关系。无论如何,您都不允许在此处使用 shell 命令。你能制作一个运行 myscript.sh 的 python 方法/函数吗?
    • 我怀疑声明冲突,我的意思是我不应该声明 manage_path 来执行 .sh 文件,而我必须声明 manage_path 用于 dumpdata 命令...
    【解决方案3】:

    在拔了几天头发后,我终于找到了可行的解决方案。

    1. 我使用 putty (SSH) 登录到服务器
    2. 键入命令:crontab -e
    3. 您将看到 crontab 作业列表
    4. 直接添加我的工作,我输入:

      0 3 * * * cp -pRu /home/path/to/my/project/file_dir /home/path/to/my/backup/dir

    这只会在每天凌晨 3 点根据 file_dir 中的时间戳将新文件/目录复制到 backup_dir

    1. 输入完毕后,按ESC,再按CTRL+x,会询问是否要保存,输入Y,回车即可保存文件。
    2. 按类型检查所有 crontab 作业:crontab -l
    3. 就是这样!干杯!

    希望对遇到类似问题的人有所帮助:D

    PS:也感谢 Igor 和 zsquare。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多