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:\mylike\Crontab-New\bin 下的三個 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
 

二、修改crontab\bin目錄下的兩個文件: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:\develop\crontab-master\bin com.main.Crontab -r" /sc MINUTE /mo 1
schtasks /create /tn "MyCrontabTask" /tr " java -cp D:\develop\crontab-master\bin 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.3\Lib\site-packages\django_crontab\crontab.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.3\Lib\site-packages\django_crontab\app_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:\develop\python-3.6.3\python.exe F:\Workspaces\xinzhi\manage.py crontab run 1ddadd8c6b5dcf1b27092df977feaf6f >> log/run.log # django-cronjobs for xinzhi

  將runjob文件中的內容復制到conf/schedule.conf中:注意不要復制注釋。

  添加並啟動定時任務就行了。

  直接在django中添加django-crontab,運行后一點反應都沒有,還沒搞明白為什么?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM