• django在windows设置定时任务,勉强能用


    推荐三篇文章

    【Django】Django 定时任务实现(django-crontab+command)

    django中使用定时任务执行某些操作时的规范操作

    windows配置crontab

    前两篇文章介绍了django-crontab的两种使用方法,网上的资料很多。

    一、Windows 版 Crontab [JAVA]

      Crontab 是 Linux 的一个计划任务管理工具,你可以在那上面添加一些任务,在指定的时间让它在后台运行,经常用来定时清除系统或程序的缓存,可以定时执行任意的脚本等等,这些功能在 Linux 上都是非常有用的,尤其是当 Linux 做为服务器来用时。
      为什么 Windows 上没有一个呢
      已经有人做了,像python版的 [pycron](http://www.kalab.com/freeware/pycron/pycron.htm) 和 Perl 版的 [cronw](http://cronw.sourceforge.net/),它们和 Linux 系统上的 Crontab 功能基本一致,它们会在         Windows 注册一个系统服务来定时运行计划任务。它们忽略了两个 Windows 用户的重要特性:
      1. Windows 不是服务器,经常需要关机,关机后计划任务就无效了,那我定制它还有什么用
      2. Windows 上不像 Linux 那样有很多强大的命令程序,想写个计划任务,确没有好的工具;自己写个工具,又不好管理
      关于 Windows 上没有强大的命令程序:用户可以去安装一些工具,它会自带有很多 Linux 的命令程序,你只要将这些命令程序的目录写入你的环境变量 Path 中就行了,我所知道的带有 Linux 命令程序的软件有 [Git](http://git-scm.com/)、[Ruby](http://rubyinstaller.org/) 和 [unxutils](http://unxutils.sourceforge.net/)*
      本程序很巧妙的解决了上面两个问题  详情请继续往下看
      功能简介
    • 完全兼容 Linux 版的计划任务,格式 `分 时 日 月 周  命令`
    • 支持多行写法,如果命令太长,需要用多行完成,可以在换行的时候未尾加上 "",
    • 记录任务运行日志、错误日志,日志文件可以自由配置
    • 有一个专门管理自己脚本的文件夹,里面的脚本可以直接使用在计划任务的 `命令` 中,可以不带路径参数
    • 任务运行失败除了记录日志外,还可自动弹窗提醒用户,以防错过一些重要的命令**
    • 如果关机了,任务本来应该运行但没得到运行,可以在开机的自动运行这些错过的任务(需要对任务进行配置,默认是不会的)**
    • 自动记录你每天的开机时间,关机时间,空闲时间,形成图表显示,方便您了解自己的电脑使用习惯【正在开发中】**
    • 更多功能还在开发中,敬请期待...

      安装
    1. 安装 [JDK](http://docs.oracle.com/javase/7/docs/webnotes/install/)
    2. 下载[nircmd](http://www.nirsoft.net/utils/nircmd.html)(它主要用来隐藏运行的命令界面),把它的可执行文件目录写入你的环境变量PATH中(未安装成功,所以修改了crontab_install.bat和crontab_uninstall.bat文件(下面介绍),也能用,就是每次执行显示命令界面,执行完消失)
    3. 下载本程序代码;
    4. 将下载后的文件解压后放到你希望的一个目录下,比如我把它放在 C:mylike 文件夹上
    5. 修改 C:mylikeCrontab-Newin 下的三个 bat 文件,主要是修改里面的bin目录成你当前的bin目录(未找到crontab_unstall.bat文件中的目录,所以没修改)
    6. 直接双击运行 crontab\_install.bat(主要是在Windows上添加了一个[计划任务](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/schtasks.mspx)),计划即启动完成。需要卸载的运行 crontab\_uninstall.bat就行, crontab.bat 是一个用户脚本,可以用来查看自己的计划任务,查看它的下次运行时间,同时还可以强制运行一个指定的任务

      使用
      配置schedule.conf
      格式:[tags] * * * * * command
     

    二、修改crontabin目录下的两个文件:crontab_install.bat和crontab_unstall.bat

      由于nircmd没有安装成功,为了能够使用,修改了这两个文件。
      crontab_install.bat
    @ECHO OFF
    rem schtasks /create /tn "MyCrontabTask" /tr "nircmd.exe exec hide java -cp D:developcrontab-masterin com.main.Crontab -r" /sc MINUTE /mo 1
    schtasks /create /tn "MyCrontabTask" /tr " java -cp D:developcrontab-masterin com.main.Crontab -r" /sc MINUTE /mo 1
    
    pause

      crontable_uninstall.bat,执行的时候总是出错,就都注释了。

    @echo off
    
    schtasks /delete /tn "MyCrontabTask" /f
    
    rem IF errorlevel 1 GOTO ERROR
    rem IF errorlevel 0 GOTO SUCCESS
    rem 
    rem :ERROR
    rem echo 您还没有安装,无须卸载!
    rem GOTO END
    rem 
    rem :SUCCESS
    rem echo 您已成功卸载!
    rem GOTO END
    rem 
    rem 
    rem :END
    pause

       修改了这两个文件后,在conf/schedule.conf中写好定时任务后,运行crontab_install.bat创建并添加定时任务,此时就已经在执行了,可以运行 crontab -l 查看任务,运行crontab_uninstall.bat删除定时任务。这样就可以在windows下执行定时任务了,向linux一样。

      定时任务有了,如何在django下执行呢?django-crontab模块

    三、通过django-crontab模块获得任务执行脚本

      如何使用django-crontab配置定时任务,在这两篇文章中有介绍:

    【Django】Django 定时任务实现(django-crontab+command)

    django中使用定时任务执行某些操作时的规范操作

      但是在windows下,运行python manage.py crontab add以及crontab的其他命令时都提示

        系统找不到路径

      在python-3.6.3Libsite-packagesdjango_crontabcrontab.py源码中发现两个函数read和write:

      每次添加和执行任务时都会执行这两个函数,但是一些命令应该不适合windows下使用,所以修改这两个函数如下:

          

        # def read(self):
        #     """
        #     Reads the crontab into internal buffer
        #     """
        #     self.crontab_lines = os.popen('%s -l' % self.settings.CRONTAB_EXECUTABLE).readlines()
        # 
        # def write(self):
        #     """
        #     Writes internal buffer back to crontab
        #     """
        #     fd, path = tempfile.mkstemp()
        #     print(tempfile.mkstemp())
        #     tmp = os.fdopen(fd, 'w')
        #     for line in self.crontab_lines:
        #         tmp.write(line)
        #     tmp.close()
        #     os.system('%s %s' % (self.settings.CRONTAB_EXECUTABLE, path))
        #     os.unlink(path)
            
        def read(self):
            """
            Reads the crontab into internal buffer
            """
            tmp = open('%s/runjob' % self.settings.CRONTAB_EXECUTABLE,'r')
            self.crontab_lines = tmp.readlines()
    
        def write(self):
            """
            Writes internal buffer back to crontab
            """
            tmp = open('%s/runjob' % self.settings.CRONTAB_EXECUTABLE,'w')
            for line in self.crontab_lines:
                tmp.write(line)
            tmp.close()

      并修改python-3.6.3Libsite-packagesdjango_crontabapp_settings.py的CRONTAB_EXECUTABLE:

            # self.CRONTAB_EXECUTABLE = getattr(settings, 'CRONTAB_EXECUTABLE', '/usr/bin/crontab')
            self.CRONTAB_EXECUTABLE = getattr(settings, 'CRONTAB_EXECUTABLE', 'crontab')

      改成已知目录,我这里改成了项目根目录下的crontab,再次运行python manage.py crontab add会在项目根目录下crontab下生成一个文件:runjob

      在项目配置文件的settings.py中定义了这样一个定时任务:

    CRONJOBS = [
        # 表示每过一分钟执行一次
        # ('*/1 * * * *', 'timeupdate.time_task.task'),
        ('*/1 * * * *', 'django.core.management.call_command', ['timetask'],{},'>> log/run.log') #timetask函数中只有一个print()
        # 后面的>> /tmp/testapi_crontab.log' 表示将定时执行的函数的打印结果输出到已经在本机中建立好的log文件中,方便调试。

      对应生成的文件内容runjob如下:

    */1 * * * * D:developpython-3.6.3python.exe F:Workspacesxinzhimanage.py crontab run 1ddadd8c6b5dcf1b27092df977feaf6f >> log/run.log # django-cronjobs for xinzhi

      将runjob文件中的内容复制到conf/schedule.conf中:注意不要复制注释。

      添加并启动定时任务就行了。

      直接在django中添加django-crontab,运行后一点反应都没有,还没搞明白为什么?

     
  • 相关阅读:
    2017.10.27
    2017.10.26
    codeforces 652 E Pursuit For Artifacts
    bzoj 1123 BLO
    bzoj 2839 集合计数
    bzoj 3170: [Tjoi 2013]松鼠聚会
    bzoj 2503 相框 欧拉回路
    bzoj 1786 [Ahoi2008]Pair 配对
    bzoj 1014 [JSOI2008]火星人prefix 哈希+splay
    csp-s74 瓶颈
  • 原文地址:https://www.cnblogs.com/lixiang1993/p/9545589.html
Copyright © 2020-2023  润新知