我使用的是ubuntu14.4,所以在ubuntu中一切正常,在其他linux系統中應該都差不多。
1 計劃任務,crontab命令選項:
-u指定一個使用者,
-l列出某個使用者的任務計劃,
-r刪除某個使用者的任務,
-e編輯某個使用者的任務
2 cron檔案語法:
分 小時 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值範圍,0表示週日一般一行對應一個任務)
可用crontab -e命令來編輯,編輯的是/var/spool/cron下對應使用者的cron檔案,也可以直接修改/etc/crontab檔案
具體格式如下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 命令
每個欄位代表的含義如下:
Minute 每個小時的第幾分鐘執行該任務
Hour 每天的第幾個小時執行該任務
Day 每月的第幾天執行該任務
Month 每年的第幾個月執行該任務
DayOfWeek 每週的第幾天執行該任務
Command 指定要執行的程式
記住幾個特殊符號的含義:
"*"代表取值範圍內的數字,
"/"代表"每",
"-"代表從某個數字到某個數字,
","分開幾個離散的數字
3 新增一個計劃任務
crontab -e 然後新增相應的任務,wq存檔退出。
4 檢視計劃任務
檢視排程任務
crontab -l //列出當前的所有排程任務
crontab -l -u jp //列出使用者jp的所有排程任務
5 例子1,增加一個計劃任務
* * * * * date > test
6 重啟cron服務
service cron restart
注意:每次修改完crontab後,需要重啟服務。
可以看到test檔案每秒鐘會進行一次更新。
例子2,寫一個python指令碼,定時執行
test2.py檔案程式碼如下
#!/usr/bin/python import time def fun1(): lastsec = 4 with open("test",'a+') as fobj: for i in range(2*lastsec): tm = time.strftime("%Y-%m-%d %H:%M:%S") fobj.write(tm+"\n") time.sleep(0.5) def test(): fun1() if __name__=="__main__": test()
要想要執行該檔案,需要新增可執行許可權
chomd +x test2.py
新增一個計劃任務
*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test2.py
注意:為了安全起見所有的路徑都需要是絕對路徑。
但是沒有執行,後來上網查詢資料,需要檢視日誌,找了半天沒有,原來是ubuntu系統預設沒有開啟日誌。所以要先開啟日誌,日誌檔案在/var/log/cron.log
方法:
1) 修改rsyslog檔案,將/etc/rsyslog.d/50-default.conf 檔案中的#cron.*前的#刪掉;
2) 重啟rsyslog服務service rsyslog restart
3) 重啟cron服務service cron restart
這樣就可以看到日誌了。
8月 27 15:42:01 pc-virtual-machine CRON[10196]: pam_unix(cron:session): session opened for user pc by (uid=0)
8月 27 15:42:01 pc-virtual-machine CRON[10197]: (pc) CMD (/usr/bin/python /home/pc/work/ENV/project/test2.py)
可以看到計劃任務卻是執行了。但是為什麼沒有輸出檔案test呢?
然後自己手動執行計劃任務中的命令,/usr/bin/python /home/pc/work/ENV/project/test2.py
pc@pc-virtual-machine:/var/spool$ /usr/bin/python /home/pc/work/ENV/project/test2.py
Traceback (most recent call last):
File "/home/pc/work/ENV/project/test2.py", line 18, in <module>
test()
File "/home/pc/work/ENV/project/test2.py", line 16, in test
fun1()
File "/home/pc/work/ENV/project/test2.py", line 9, in fun1
with open('test','a+') as fobj:
IOError: [Errno 13] Permission denied: 'test'
給我報錯了,仔細一看,原來是自己的指令碼有問題,輸出的 test檔案應該是絕對路徑,不應該是相對路徑,可能是程式不是在指令碼所在的資料夾力執行,所以有可能會產生許可權問題。
所以,經過修改後,test2.py檔案如下
#!/usr/bin/python import time import os def fun1(): lastsec = 4 curdir = os.getcwd() filename = os.path.join(curdir,"test") with open('/home/pc/work/ENV/project/test','a+') as fobj: for i in range(2*lastsec): tm = time.strftime("%Y-%m-%d %H:%M:%S") fobj.write(tm+"\n") time.sleep(0.5) def test(): fun1() if __name__=="__main__": test()
然後重啟cron服務。
ls
startpy.sh test test2.py
可以看到有了輸出。
more test
2016-08-27 16:52:01
2016-08-27 16:52:02
2016-08-27 16:52:02
2016-08-27 16:52:03
2016-08-27 16:52:03
2016-08-27 16:52:04
2016-08-27 16:52:04
2016-08-27 16:52:05
大功告成!!!
linux中將一個指令碼檔案作為一個計劃任務小結,以python指令碼為例:
1 建立指令碼檔案test.py,在檔案開頭需要加上下面一行
#!/usr/bin/python
上面這行的作用是說明使用那個直譯器來執行該檔案,如果不知道python直譯器在哪,可以使用命令which python來檢視
2 給該檔案新增可執行的許可權
chmod +x test.py
注意:在指令碼檔案中如果涉及檔案操作,請使用絕對路徑,我就是在這上面掉坑裡了。
3 新增計劃任務
crontab -e
在檔案中追加一行,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py
儲存退出,:wq
4 重啟cron服務
service cron restart
結束
正常情況下應該是可以執行的,如果有問題,可以按照如下步驟找到問題所在
檢視cron的log,在/var/log/cron.log,想ubuntu預設情況下是沒有開啟的,所以要自己手動開啟log
如果有log輸出,說明計劃任務試執行正常的,那就有可能是你配置有問題,自己手動執行一下計劃任務中的cmd命令,像我開始那樣就是由於指令碼本身存在問題(不要使用檔案的相對目錄),如果成功,則說明指令碼的環境變數有問題,具體原因就需要檢視crontab傳送的錯誤郵件了。