錯誤描述:
centos7使用定時任務crontab跑python腳本,報錯 ImportError: No module named XXXX
提示找不到模塊需要導包。
但是不在定時任務裏面執行,直接用python3 命令執行py腳本的時候是沒問題的,而且之前也pip過類似的模塊。
原因分析:
應爲centos7 linux環境安裝的時候是默認安裝了python2.幾的版本,所以定時任務cron默認使用的是py2的環境
#crontab -e
查看下我的定時任務配置
下面我們來解析下:
29 09 * * * 這個沒啥好說的,每天9點29分執行定時任務
nohup 表示後臺運行
python3 -u /usr/python/sgl_shell/gp_notice/gp.py 表示使用python3 去執行gp.py這個腳本 (問題就出在這)
>> /usr/python/sgl_shell/gp_notice/shell_log/run.log 2>&1 這個也沒啥好說的,就是指定日誌輸出位置
解決方法:
問題就出在第三行用python3去執行py腳本那裏
定時任務裏需要使用python3命令的時候需要使用全路徑名
如:/usr/local/bin/python3 -u /usr/python/sgl_shell/gp_notice/gp.py
或者第一行加一個環境指定
如:
#!/usr/local/bin/python3
xxxx python3 -u /usr/python/sgl_shell/gp_notice/gp.py
這樣配置後,執行定時任務腳本的時候就會以python3去執行腳本了,而不是使用系統默認的python2
注意:但是光像上面那樣改完還是會報錯,因爲定時任務裏環境裏crontab還是感知不到相關的環境變量
即使你使用python3命令去執行了還是找不到模塊包的位置,需要手動導入下環境變量
需要再加一個命令:
source /etc/profile; (分號不能少)
如:
#!/usr/local/bin/python3
xxxx source /etc/profile; /usr/local/bin/python3 -u /usr/python/sgl_shell/gp_notice/gp.py
這樣就可以正常執行了,且不會再報少包少模塊錯誤!
下面附上我的完整配置:
#!/usr/local/bin/python3
29 09 * * * source /etc/profile; nohup /usr/local/bin/python3 -u /usr/python/sgl_shell/gp_notice/gp.py >> /usr/python/sgl_shell/gp_notice/shell_log/run.log 2>&1
最後附上centos7 常用設置定時任務命令:
設置定時任務
方法一:vi /etc/crontab
方法二:(推薦)
直接用crontab -e,不需要指定用戶,如果是root權限,默認是root定時的
systemctl start crond.service 啓動服務
systemctl stop crond.service 關閉服務
systemctl restart crond.service 重啓服務
systemctl reload crond.service 重新載入配置
systemctl status crond.service 服務是否運行