django-crontab 在ubuntu-18.04.2上的使用
需求:django项目中需添加定时任务,定时执行某个函数或者自定义的命令等)
pip install django-crontab
INSTALLED_APPS = [
...
'django_crontab',
]
定时执行自定义函数
CRONJOBS = [
# ('*/1 * * * *', 'app名.定时函数所在的py文件名.定时函数名', '>> 输出文件路径和名称')
# 每1分钟执行restart_pm2函数,并将执行中的返回的内容全部打印到crontab.log文件中
('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log'),
]
定时执行django中自定义的命令
CRONJOBS = [
# 每1分钟执行django的自定义命令,并将执行中的返回的内容全部打印到crontab.log文件中
('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {"param": "mycommand1_test"}, '>>/home/wangzhipeng/myproject/crontab.log'),
('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {"param": "mycommand2_test"}, '>>/home/wangzhipeng/myproject/crontab.log')
]
格式:
参数1:定时 例如*/1 * * * * 表示每隔1分钟执行
参数2:方法的python模块路径,如果执行django-admin命令,则写django.core.management.call_command
参数3:方法的位置参数列表(默认值:[]),如果执行django-admin命令,则填写所需执行的命令
参数4:方法的关键字参数的dict(默认值:{})
参数5:执行log存放位置(即重定向到文件,默认:’’)
4.1 在对应的应用下创建定时执行的函数(apps/app1/task.py文件中,添加is_restart_pm2()函数)
def restart_pm2():
from time import strftime, localtime
print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
print("执行了restart_pm2函数")
4.2 在对应的应用下创建定时执行的函数(创建apps/app1/management/commands文件,注意management与commands要引入 __init__py作为模块使用中,在commands下创建自定义的命令,如下图所示:)
在commands文件下创建两个命令文件:mycommand1.py,mycommand1.py,内容如下:
mycommand1.py如下:
from django.core.management.base import BaseCommand, CommandError
from time import strftime, localtime
class Command(BaseCommand):
help = '这是第一个command测试指令'
# 为handle中添加参数解析,
def add_arguments(self, parser):
parser.add_argument(
'-p', # 设置参数的时候 前边携带
'--param',
action='store',
dest='param', # 自定义传入的参数键名ss
default='close', # 默认的键值
help='name of author.',
)
def handle(self, *args, **options):
# print("mycommand1----开始")
'''
添加你需要功能,(访问数据库,判断有效性等等)
...
'''
# 例如
try:
if options['param']:
print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
print(": mycommand1传入的参数为", options['param'])
# except Exception as e:
except Exception as e:
print("12",e)
print(CommandError("1111111111111111111111111"))
# print("mycommand1----结束")
mycommand2.py如下:
from django.core.management.base import BaseCommand
from time import strftime, localtime
class Command(BaseCommand):
help = '这是第二个command测试指令'
# 为handle中添加参数解析,
def add_arguments(self, parser):
parser.add_argument(
'-p', # 设置参数的时候 前边携带
'--param',
action='store',
dest='param', # 自定义传入的参数键名ss
default='close', # 默认的键值
help='name of author.',
)
def handle(self, *args, **options):
# print("mycommand2----开始")
'''
添加你需要功能,(访问数据库,判断有效性等等)
...
'''
# 例如
if options['param']:
print(strftime("%Y-%m-%d %H:%M:%S", localtime()), end='')
print("mycommand2传入的参数为", options['param'])
# print("mycommand2----结束")
4.3 测试自定义django命令
输入:python3 manage.py mycommand1 -p 123
输出:2019-05-10 15:10:59: mycommand1传入的参数为 123
结果:ok,可以使用
添加并开启定时任务:python3 manage.py crontab add
结果如下:
adding cronjob: (bf1cd50420be34c5385feba0ccbc8a2a) -> ('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log')
adding cronjob: (3c1cf37daf3135751e741524b9b4da0b) -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {'param': 'mycommand1_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
adding cronjob: (d0d72e1cb25439aca55cbcddd5779427) -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {'param': 'mycommand2_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
python环境查看定时任务:python3 manage.py crontab show
结果如下:
Currently active jobs in crontab:
bf1cd50420be34c5385feba0ccbc8a2a -> ('*/1 * * * *', 'app1.tasks.restart_pm2', '>>/home/wangzhipeng/myproject/crontab.log')
3c1cf37daf3135751e741524b9b4da0b -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand1'], {'param': 'mycommand1_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
d0d72e1cb25439aca55cbcddd5779427 -> ('*/1 * * * *', 'django.core.management.call_command', ['mycommand2'], {'param': 'mycommand2_test'}, '>>/home/wangzhipeng/myproject/crontab.log')
在linux中(root下)查看定时i任务: crontab -l
结果如下:
*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run bf1cd50420be34c5385feba0ccbc8a2a >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery
*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run 3c1cf37daf3135751e741524b9b4da0b >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery
*/1 * * * * /home/wangzhipeng/myproject/djangocelery/djangocelery/venv/bin/python3 /home/wangzhipeng/myproject/djangocelery/djangocelery/manage.py crontab run d0d72e1cb25439aca55cbcddd5779427 >>/home/wangzhipeng/myproject/crontab.log # django-cronjobs for djangocelery
查看/home/wangzhipeng/myproject/crontab.log
中的打印的信息:执行成功了
查看系统中已有的定时任务:
python3 manage.py crontab show
添加和修改定时任务:
python3 manage.py crontab add
删除定时任务:
python3 manage.py crontab remove
django-crontab只能基于linux环境中才能使用(本文都是在ubuntu的root下实现的,普通用户下有小问题,未解决)
service cron status
service cron start
cat /var/log/cron.log
crontab -l
crontab -e
参考: