django在windows設置定時任務,勉強能用

推薦三篇文章html

【Django】Django 定時任務實現(django-crontab+command)java

django中使用定時任務執行某些操做時的規範操做python

windows配置crontablinux

前兩篇文章介紹了django-crontab的兩種使用方法,網上的資料不少。git

1、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
 

2、修改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,執行的時候老是出錯,就都註釋了。web

@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同樣。spring

  定時任務有了,如何在django下執行呢?django-crontab模塊django

3、經過django-crontab模塊得到任務執行腳本

  如何使用django-crontab配置定時任務,在這兩篇文章中有介紹:windows

【Django】Django 定時任務實現(django-crontab+command)api

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,運行後一點反應都沒有,還沒搞明白爲何?

相關文章
相關標籤/搜索