日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux执行定时任务(crontab)遇到的坑

發布時間:2023/12/20 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux执行定时任务(crontab)遇到的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 前言:
  • 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

總結

以上是生活随笔為你收集整理的Linux执行定时任务(crontab)遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。