文章目錄
- 前言:
- 1、建立定時任務的兩種方式
- 1.1、crontab -e
- 1.2、vi /etc/ crontab
- 2、兩種方法的區別
- 2.1、用戶級
- 2.2、系統級
- 3、解決辦法
前言:
之前第一次要在生產環境部署定時任務,無奈的是,博主對定時任務這塊還是個小白,但是任務卻需要部署一連串的定時任務,前后的定時任務之間還有關聯。。。由于數據采集的時間有特殊要求,所以整個流程就挺惡心的更別說部署了,部署之后有想過用Azkaban來串聯多個定時任務,但是由于其他原因也沒來得及實踐,這里記錄下期間遇到的坑。
剛開始實現第一個crontab定時任務時,就遇到很多問題。這里參考了網上的一些文章,如:
第一步:寫cron腳本文件,命名為crontest.cron。
15,30,45,59 * * * * echo “xgmtest…..” >> xgmtest.txt 表示,每隔15分鐘,執行打印一次命令第二步:添加定時任務。執行命令 “crontab crontest.cron”。搞定第三步:”crontab -l” 查看定時任務是否成功或者檢測/var/spool/cron下是否生成對應cron腳本
1、建立定時任務的兩種方式
但是差點把之前老員工部署的定時任務給搞丟(由于不懂原理差點鑄成大錯)。。所以就先來說下定時任務的兩種添加方式:
1.1、crontab -e
#直接寫入定時任務
*/10 17-18 * * * root tcpdump -i eth0 tcp port 80 -s 0 -w sohu1.txt
*/10 17-18 * * * root tcpdump -i eth0 tcp port 80 -s 0 -w sohu1.cap
1.2、vi /etc/ crontab
vi /etc/ crontab
#添加定時任務
30 10 * * * root /sbin/reboot重新加載配置
/sbin/service crond reload
重啟cron
/sbin/service crond restart
2、兩種方法的區別
crontab -e對應的是用戶級,vi /etc/ crontab對應的系統級的
2.1、用戶級
使用crontab -e 這個命令會自動打開vim然后編輯定時腳本文件,編寫后保存,在ubuntu下會被寫到/var/spool/cron/crontabs目錄下,生成一個和用戶名一致的文件,我們可以直接用crontab -l查看內容,
ml@linux:~$ crontab -e
ml@linux:~$ crontab -l
30 * * * * /home/ml/tools/login.sh
ml@linux:~$ sudo cat /var/spool/cron/crontabs/ml
30 * * * * /home/ml/tools/login.sh
2.2、系統級
cronotab -e是針對用戶來設計的,如果是系統的例行性任務,需要編輯/etc/crontab這個文件,編輯完所有用戶都會受其影響:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
0 * * * * root /home/ml/tools/login.sh
每列分別是分、時、日、月及周進行一次的工作!但是在五個字段后面接的并不是命令,而是執行命令的身份!這個用戶的crontab -e不相同。由于用戶自己的crontab并不需要指定身份,但/etc/crontab里面需指定身份。
OK,添加了定時任務就要看這個定時任務是否生效,但是實際操作中執行定時的python腳本時,如下
#40 15 * * * /usr/local/bin/python3 /opt/FileTransclation.py(每天在15:40自動上傳文件)
卻報各種錯誤,基本上全是和環境相關,但問題是,我再Linux下手動執行改腳本時,卻沒有任何問題,這里大膽懷疑定時任務在執行這個python腳本時用的別的環境變量,后來查了資料發現,懷疑果然成立,crontab有自己的用戶,在執行腳本的時候會用自己的環境變量,而我們用的是我們自己的環境變量(裝有python及所需環境),所以也就能解釋為什么執行python腳本會失敗了。根據網上的文章一頓操作,修改了crontab的啟動時的環境變量,但是發現問題依舊存在。。。但是,這就真的沒有其他的解決辦法了嗎?怎么會,既然沒法直接啟動python腳本,我們可以間接啟嗎!既然crontab的環境變量和用戶的環境變量有差異,那我們就利用兩者的環境變量相同的地方。
3、解決辦法
通過自定義shell腳本,然后用定時任務來啟shell腳本(shell環境變量兩者肯定都有吧),在shell腳本里面來啟Python腳本,但前提是你要指定對應的環境變量
模板如下:
第一步:添加定時任務
crontab -e
#添加定時任務
40 09 * * * cd /root/auto_call; ./start_auto_call.sh >> auto_call.log 2>&1
第二步:創建shell腳本
vi start_auto_call.sh
#!/bin/bash
. /etc/profile
. ~/.bash_profile
set -xpython auto_call.py
這樣只要能在你當前環境下運行的任務,也一定可以在crontab中運行!
參考:https://blog.csdn.net/idkevin/article/details/72948962