打這篇文章的時候蠻有成就感的,因為終於找出來Crontab沒有正常執行Python script的bug了!!!!!
原因很簡單,就是Crontab預設的環境變數,沒法執行 rm 和 ifconfig 這兩個指令!! 所以加上絕對路徑後,就沒問題了( /bin/rm /sbin/ifconfig )
在當中做過蠻多設定的,但似乎都沒見效...過程如下:
1. 發現DB中的Data並沒有定時做更新,所以我先查了 Crontab 的 Log檔
vim /var/log/syslog
Jan 22 20:29:01 wayne21205-BM5275-BM5375-BM5675 CRON[723]: (root) CMD (/wayne_code/shell_code/Send_Infor_To_Pox.sh)
Jan 22 20:29:01 wayne21205-BM5275-BM5375-BM5675 CRON[722]: (CRON) info (No MTA installed, discarding output)
2. 從Log檔發現我沒安裝MTA( Mail Transfer Agent )
apt-get install exim4
vim /etc/crontab
加入MAILTO="wayne21205@gmail.com"
但也沒寄Error Log到我的信箱阿,當時覺得蠻奇怪的!! 不過後來發現我的Python script其實是有正確被執行的,只是rm和ifconfig沒法運作,造成寫入的文字檔是空的,
之後DB的操作就沒效了!!
3. 更改 Crontab 的設定檔
vim /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="******"
/etc/init.d/cron restart ( 記得要重啟 Crontab 唷!! )
改完之後,我發覺沒有改變甚麼耶...
1. 還是沒有正確update資料庫的data
2. Error Log還是沒寄過來我的信箱...
4. 直到我用一行行trace code後發現問題出在以下4行
subprocess.call("/bin/rm /ip_address.txt",shell=True)
subprocess.call("/bin/rm /MAC_address.txt",shell=True)
subprocess.call("/sbin/ifconfig | grep inet | awk '{print $2}' >> /ip_address.txt",shell=True) # Get the IP Address
subprocess.call("/sbin/ifconfig | grep HWaddr | awk '{print $5}' >> /MAC_address.txt",shell=True) #Get the MAC Address
關鍵在於 ifconfig 那行產生出來的 ip_address.txt 竟然沒有任何內容...( 是一個空檔 )
好了,直到這部我才發現問題所在!!
加上 /sbin 就解決了這個問題摟!!!!!
總結:
Crontab中的程式,不管是 指定或產生的檔案位置(Ex: open("檔案路徑要寫絕對路徑")) 、 指令( /sbin/ifconfig ),都一定要寫絕對路徑!!!!!
不知指令的絕對路徑,可用echo $PATH秀出常見的指令路徑後,做個測試就知道摟~~
另外,Crontab最細只可設定成到分鐘執行(min), 也就是說沒辦法設定crontab成 每n秒鐘 執行一次!!
解法是透過Shell script + sleep函式即可解決。可參考 http://phorum.vbird.idv.tw/viewtopic.php?f=2&t=33237
Python問題發問區:
stackoverflow發問區:http://stackoverflow.com/questions/ask/advice?
