crontab是linux下實現定時任務的命令,但是他還是有很多坑需要我們注意,這裏列舉一些,如果遇到新的會再更新。
1.shell腳本能單獨運行,但是計劃任務裏面無法運行
這種問題往往是環境變量的問題,就是你所執行的命令沒有明確一些環境變量。建議的解決辦法:
(1)在所寫腳本上加入環境變量,如下:
export PATH=/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/home/x/bin:/usr/bin
或者加入這句話
source ~/.bash_profile
(2)將所有的涉及到文件夾的都用絕對地址而不用相對地址
雖然上面導入了環境變量,但是還是建議寫完整的絕對地址,比如python,寫成/usr/bin/python。特別是有寫入文件的情況,比如原來的shell腳本本來是
python 1.py >> 1.txt
一定要寫成這樣
/usr/bin/python /home/1.py >> /home/1.txt
(3)將crontab裏面的定時執行命令進行一些修改,如下:
將crontab執行的語句進行修改:
15 11 * * * /home/loganalysis/dealexcel.sh >> /home/loganalysis/error.log 2>&1
修改爲:
15 11 * * * cd /home/loganalysis/ && ./dealexcel.sh >> /home/loganalysis/error.log 2>&1
這個方法引用於https://blog.csdn.net/jkunzhang/article/details/7440215 這篇文章
2.如果腳本里面帶有參數,無法執行
如果你已經注意了上面的問題,但是你的腳本有參數,例如原腳本如下:
python test.py -s 123456 -p 123456
你在crontab裏面寫成了這樣
* * * * * /usr/bin/python /home/test.py -s 123456 -p 123456
這種有參數的建議的做法是創建一個shell腳本把這個腳本全部寫在shell腳本里,例如上面的例子,我們創建一個test.sh,test.sh的內容如下:
#!/bin/bash/
export PATH=/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/home/x/bin:/usr/bin
/usr/bin/python /home/test.py -s 123456 -p 123456
然後我們在crontab這樣寫
* * * * * /home/test.sh
這個時候如果不能執行,就是這個shell腳本沒有執行權限,使用命令chmod a+x test.sh
如果還不能執行的話,就按照第一點的第三小點,改寫成下面這樣:
* * * * * cd /home/ && ./test.sh