推薦三篇文章html
【Django】Django 定時任務實現(django-crontab+command)java
django中使用定時任務執行某些操做時的規範操做python
windows配置crontablinux
前兩篇文章介紹了django-crontab的兩種使用方法,網上的資料不少。git
@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
如何使用django-crontab配置定時任務,在這兩篇文章中有介紹:windows
【Django】Django 定時任務實現(django-crontab+command)api
可是在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,運行後一點反應都沒有,還沒搞明白爲何?