打這篇文章的時候蠻有成就感的,因為終於找出來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?

 

文章標籤
全站熱搜
創作者介紹
創作者 Wayne 的頭像
Wayne

Wayne Technique Study

Wayne 發表在 痞客邦 留言(0) 人氣(407)