伺服器部署python指令碼並使用crontab定時執行
生命不息,折騰不止。
前幾日做了一個python指令碼用於每天疫情簽到。想試著用伺服器每天定點執行。
折騰了一天,算是成了,給大家分享一下踩坑,尤其時Crontab!!
伺服器設定
首先,我們使用鈔能力搞一臺伺服器,不管是華為、騰訊、阿里的伺服器價格都差不多。在這裡我選了騰訊的。安裝Ubuntu 20.04 LTS:
按照騰訊說明配置好SSH後使用putty登入伺服器:
使用python3 --version
系統已經內建了python3.8.5:
但是沒裝pip3:
sudo apt-get install python3-pip
至此環境配置完成
程式碼執行嘗試
首先將程式碼上傳至/home/ubuntu目錄下,我們可以使用WinSCP上傳檔案。為了更方便的除錯程式碼,可以使用Pycharm遠端連線除錯。但程式碼每次都無法同步,還是建議本地除錯好直接上傳。
我的程式碼分為兩個指令碼,runer.py和login.py。runer.py為入口,依賴login.py。我們嘗試使用命令執行:
python3 runer.py
發現缺少lxml及相關包,使用pip3安裝:
sudo pip3 install lxml
...
這裡有一個天坑!不要用pip3 install lxml,這樣在正常情況下也能用,用python3 *.py可以執行,但是crontab執行會有問題!
Crontab除錯
crontab很難伺候,不管是環境還是指令碼地址都需要絕對路徑,因此我們使用一個.sh檔案作為入口:
#start.sh檔案,位於/home/ubuntu/sign/下
cd /home/ubuntu/sign
python3 runer.py >> hist
首先跳入我們的指令碼地址,這樣就不會出找不到指令碼了。
注意,一定要指定python直譯器版本,如果你有兩個python3,你需要指定到python的位置!
crontab沒有輸出視窗,因此我們可以把程式碼中print的內容儲存在同級目錄中的hist檔案。
接下來配置crontab。首先開啟crontab設定介面:
sudo crontab -e
配置格式可參見https://www.runoob.com/w3cnote/linux-crontab-tasks.html
在這裡,建議開啟日誌記錄,自帶日誌需要配置syslog,且不會記錄執行出錯的內容,例如python找不到包之類的錯誤,因此建議自己配置日誌輸出:
我配置的結果:
00 08 * * * sudo bash /home/ubuntu/sign/start.sh > /home/ubuntu/sign/log 2>&1 &
意思是每日早上8點執行,錯誤日誌輸出至同級的目錄的log檔案。
在除錯時我們可以設定一個每分鐘執行一次的任務:
*/1 * * * * sudo bash /home/ubuntu/sign/start.sh > /home/ubuntu/sign/log 2>&1 &
重啟crontab:
sudo service cron restart
觀察日誌檔案是否有異常,或者沒生成日誌檔案。
現在講一下這個天坑!用pip3和sudo pip3安裝包的區別:
我弄好之後,發現我的指令碼無法執行,於是我新增了一個test.py的命令,輸出一行字到hist檔案中,test可以執行。檢視log發現是沒找到lxml包,WTF我不是安裝了嗎,於是,我手動執行了該任務,也就是.sh檔案裡的:
python3 runer.py >> hist
沒錯,能執行,很多網上的教程告訴我們說是python直譯器不對,crontab預設的是usr/bin下面的。沒錯,很多錯誤都是這個原因,但這個不同,我用的就是usr/bin/python3。於是我檢視了python3:
python3
>>>import lxml
發現可以匯入,但是crontab不行!
我們繼續輸入:
>>> import sys
>>> sys.path
得到依賴包的位置集合:
['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload',
'/home/ubuntu/.local/lib/python3.8/site-packages', '/usr/local/lib/python3.8/dist-packages',
'/usr/local/lib/python3.8/dist-packages/cloud_init-20.1-py3.8.egg',
'/usr/lib/python3/dist-packages']
看看lxml包位置:
import lxml
print(lxml)
發現包的位置在/usr/.local/lib/…下。如果我們用sudo執行,必須在usr/local/…才對!
重新用sudo安裝lxml,成功執行!
相關文章
- Ubuntu伺服器定時執行Python指令碼Ubuntu伺服器Python指令碼
- 怎樣在windows上定時執行python指令碼WindowsPython指令碼
- Linux 定時執行指令碼、命令Linux指令碼
- Linux定時執行.sh指令碼Linux指令碼
- 通過 Redis 定時執行指令碼Redis指令碼
- 如何用crontab每隔1分鐘執行一個命令列指令碼,shell設定時任務命令列指令碼
- 在linux上定期執行命令、指令碼(cron,crontab,anacron)Linux指令碼
- linux crontab下的指令碼不執行怎麼辦Linux指令碼
- Linux Crontab Shell指令碼實現秒級定時任務Linux指令碼
- 執行python指令碼後臺執行Python指令碼
- 線上定時指令碼執行慢,分析過程指令碼
- Laravel 中執行 Python 指令碼LaravelPython指令碼
- python ansible如何執行指令碼?Python指令碼
- Linux下的crontab定時執行任務命令詳解Linux
- Centos 7下利用crontab定時執行任務詳解CentOS
- 如何在linux使用crontab命令定時重啟伺服器Linux伺服器
- 命令定時重啟伺服器如何在linux使用crontab伺服器Linux
- crontab 定時
- 如何使用python指令碼定時清空檔案內容?Python指令碼
- shell指令碼命令 執行python檔案&python命令列執行python程式碼指令碼Python命令列
- shell指令碼放到crontab裡就執行不成功的問題指令碼
- 使用bat指令碼執行MySQL命令時遇到的坑BAT指令碼MySql
- jmeter+nmon+crontab簡單的執行介面定時壓測JMeter
- python中怎樣執行指令碼Python指令碼
- 獲取AWR的指令碼,可以在crontab裡面部署指令碼
- 開機自動執行python指令碼Python指令碼
- python 如何執行子層 py 指令碼Python指令碼
- [轉載]ubuntu中執行python指令碼UbuntuPython指令碼
- javascript指令碼何時會被執行JavaScript指令碼
- Docker部署並執行ElasticsearchDockerElasticsearch
- 【crontab】使用cron每天定時簽到掘金
- crontab使用說明【一文搞懂Linux定時任務Crontab】Linux
- 如何使用Docker構建執行時間較長的指令碼Docker指令碼
- PHP 使用檔案鎖 避免同時執行一個指令碼PHP指令碼
- crontab定時任務
- Pycharm連線遠端伺服器並編寫、執行python程式碼PyCharm伺服器Python
- python寫的指令碼在kail Linux 執行Python指令碼AILinux
- 聊聊 Jmeter 如何併發執行 Python 指令碼JMeterPython指令碼