推薦三篇文章
【Django】Django 定時任務實現(django-crontab+command)
前兩篇文章介紹了django-crontab的兩種使用方法,網上的資料很多。
一、Windows 版 Crontab [JAVA]
2. Windows 上不像 Linux 那樣有很多強大的命令程序,想寫個計划任務,確沒有好的工具;自己寫個工具,又不好管理
- 完全兼容 Linux 版的計划任務,格式 `分 時 日 月 周 命令`
- 支持多行寫法,如果命令太長,需要用多行完成,可以在換行的時候未尾加上 "\",
- 記錄任務運行日志、錯誤日志,日志文件可以自由配置
- 有一個專門管理自己腳本的文件夾,里面的腳本可以直接使用在計划任務的 `命令` 中,可以不帶路徑參數
- 任務運行失敗除了記錄日志外,還可自動彈窗提醒用戶,以防錯過一些重要的命令**
- 如果關機了,任務本來應該運行但沒得到運行,可以在開機的自動運行這些錯過的任務(需要對任務進行配置,默認是不會的)**
- 自動記錄你每天的開機時間,關機時間,空閑時間,形成圖表顯示,方便您了解自己的電腦使用習慣【正在開發中】**
- 更多功能還在開發中,敬請期待...
安裝
- 安裝 [JDK](http://docs.oracle.com/javase/7/docs/webnotes/install/)
- 下載[nircmd](http://www.nirsoft.net/utils/nircmd.html)(它主要用來隱藏運行的命令界面),把它的可執行文件目錄寫入你的環境變量PATH中(未安裝成功,所以修改了crontab_install.bat和crontab_uninstall.bat文件(下面介紹),也能用,就是每次執行顯示命令界面,執行完消失)
- 下載本程序代碼;
- 將下載后的文件解壓后放到你希望的一個目錄下,比如我把它放在 C:\mylike 文件夾上
- 修改 C:\mylike\Crontab-New\bin 下的三個 bat 文件,主要是修改里面的bin目錄成你當前的bin目錄(未找到crontab_unstall.bat文件中的目錄,所以沒修改)
- 直接雙擊運行 crontab\_install.bat(主要是在Windows上添加了一個[計划任務](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/schtasks.mspx)),計划即啟動完成。需要卸載的運行 crontab\_uninstall.bat就行, crontab.bat 是一個用戶腳本,可以用來查看自己的計划任務,查看它的下次運行時間,同時還可以強制運行一個指定的任務
使用
二、修改crontab\bin目錄下的兩個文件:crontab_install.bat和crontab_unstall.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)
但是在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,運行后一點反應都沒有,還沒搞明白為什么?