我使用的是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發送的錯誤郵件了。