/tmp/env.txt如果你Py" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

crontab中部署Python腳本注意事項

系統 1999 0

有時候手工執行Python腳本跑的好好的,但是部署到Linux的crontab中后,就會遇到一些問題,最近終于有空整理一下這方面的內容,其實也是自己也踩了一些別人踩過的坑!這里僅僅列舉個人遇到的一些小問題,經驗和精力問題,不能面面俱到,僅總結一下自己遇到的這些問題。

?

?

環境變量問題

?

cron中的環境變量和系統的環境變量是不一樣的,我們可以通過設置定時腳本將cron中的環境變量打印出來,然后一對比,你就能發現差異

?

?????? * * * * * env > /tmp/env.txt

?

如果你Python腳本中要獲取環境變量的話,那么部署到Crontab作業后就要小心了,很有可能手工運行腳本是正常的,但是部署到Crontab后運行就不正常了,如下所示,我們構造這樣一個測試腳本crontab_env_test.py

?

              
                #!/usr/bin/python
              
            
              
                # -*- coding: utf-8 -*-
              
            
              ?
            
              import logging
            
              import os.path
            
              import os
            
              import base64
            
              ?
            
              ?
            
              ?
            
              
                # 第一步,創建一個logger
              
            
              logger = logging.getLogger()
            
              logger.setLevel(logging.DEBUG)? 
              
                # Log等級開關
              
            
              
                # 第二步,創建一個handler,用于寫入日志文件
              
            
              log_path = 
              
                '/home/konglb/logs/'
              
            
              log_name = log_path + 
              
                'kerry_test.log'
              
            
              logfile = log_name
            
              file_handler = logging.FileHandler(logfile, mode=
              
                'a+'
              
              )
            
              file_handler.setLevel(logging.ERROR)? 
              
                # 輸出到file的log等級的開關
              
            
              
                # 第三步,定義handler的輸出格式
              
            
              formatter = logging.Formatter(
              
                "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
              
              )
            
              file_handler.setFormatter(formatter)
            
              
                # 第四步,將handler添加到logger里面
              
            
              logger.addHandler(file_handler)
            
              
                # 如果需要同時需要在終端上輸出,定義一個streamHandler
              
            
              print_handler = logging.StreamHandler()? 
              
                # 往屏幕上輸出
              
            
              print_handler.setFormatter(formatter)? 
              
                # 設置屏幕上顯示的格式
              
            
              logger.addHandler(print_handler)
            
              ?
            
              ?
            
              db_user=os.environ.get(
              
                'my_env'
              
              )
            
              print(db_user)
            
              logger.error(db_user)
            

?

如下所示,手工執行該腳本,就會往/home/konglb/logs/kerry_test.log中寫入環境變量my_env的值(/etc/profile中設置了export my_env=kerry )

?

# /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

kerry

2019-08-20 20:20:18,293 - crontab_env_test.py[line:30] - ERROR: kerry

?

然后我們配置crontab后,如下所示,通過刷新日志觀察其獲取環境變量my_env的值

?

# crontab -l

*/1 * * * * ? /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

?

如下截圖所示,你會看到在Crontab中運行的Python腳本根本沒有獲取到環境變量my_env的值

?

              
                # tail -60f kerry_test.log 
              
            
              2019-08-20 20:20:18,293 - crontab_env_test.py[line:30] - ERROR: kerry
            
              2019-08-20 20:22:02,337 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:23:01,533 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:24:01,682 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:25:01,832 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:26:01,103 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:27:01,243 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:28:01,397 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:29:01,543 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:30:01,680 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:31:01,998 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:32:01,223 - crontab_env_test.py[line:30] - ERROR: None
            
              2019-08-20 20:33:01,369 - crontab_env_test.py[line:30] - ERROR: Non
            

?

那么要如何解決這個問題呢,如下所示,在執行Python腳本時,獲取/etc/profile中的系統變量(不同平臺或不同環境有所區別)

?

*/1 * * * * source /etc/profile && /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py

?

crontab中部署Python腳本注意事項_第1張圖片

?

?

還有一種方案,就是使用shell包裹Python腳本,如下所示:

?

              
                # more kerry.sh 
              
            
              ?
            
              
                #!/bin/bash
              
            
              ?
            
              source /etc/profile
            
              ?
            
              /usr/
              
                local
              
              /bin/python3.6 /home/konglb/python/crontab_env_test.py
            

?

*/1 * * * * ??? /home/konglb/python/kerry.sh

?

?

相對路徑問題

?

把上面的腳本修改一下,使用相對路徑,如下所示,然后crontab作業運行時就會報錯

?

              
                #!/usr/bin/python
              
            
              
                # -*- coding: utf-8 -*-
              
            
              ?
            
              import logging
            
              import os.path
            
              import os
            
              import base64
            
              ?
            
              ?
            
              ?
            
              
                # 第一步,創建一個logger
              
            
              logger = logging.getLogger()
            
              logger.setLevel(logging.DEBUG)? 
              
                # Log等級開關
              
            
              
                # 第二步,創建一個handler,用于寫入日志文件
              
            
              
                #log_path = '/home/konglb/logs/'
              
            
              log_path = os.path.dirname(os.getcwd()) + 
              
                '/logs/'
              
            
              log_name = log_path + 
              
                'kerry_test.log'
              
            
              logfile = log_name
            
              file_handler = logging.FileHandler(logfile, mode=
              
                'a+'
              
              )
            
              file_handler.setLevel(logging.ERROR)? 
              
                # 輸出到file的log等級的開關
              
            
              
                # 第三步,定義handler的輸出格式
              
            
              formatter = logging.Formatter(
              
                "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
              
              )
            
              file_handler.setFormatter(formatter)
            
              
                # 第四步,將handler添加到logger里面
              
            
              logger.addHandler(file_handler)
            
              
                # 如果需要同時需要在終端上輸出,定義一個streamHandler
              
            
              print_handler = logging.StreamHandler()? 
              
                # 往屏幕上輸出
              
            
              print_handler.setFormatter(formatter)? 
              
                # 設置屏幕上顯示的格式
              
            
              logger.addHandler(print_handler)
            
              ?
            
              ?
            
              db_user=os.environ.get(
              
                'my_env'
              
              )
            
              
                print
              
              (db_user)
            
              logger.error(db_user)
            

?

其實切換到其它路徑后,手工執行該腳本也會報錯誤,因為相對路徑的設置,導致一些邏輯錯誤出現,如下所示,所以如果要部署為Crontab作業的Python腳本,最好使用絕對路徑,避免出現這個問題。

?

              
                # pwd
              
            
              /root
            
              
                # /usr/local/bin/python3.6 /home/konglb/python/crontab_env_test.py
              
            
              Traceback (most recent call last):
            
              ? File 
              
                "/home/konglb/python/crontab_env_test.py"
              
              , line 19, 
              
                in
              
              
            
              ??? file_handler = logging.FileHandler(logfile, mode=
              
                'a+'
              
              )
            
              ? File 
              
                "/usr/local/lib/python3.6/logging/__init__.py"
              
              , line 1031, 
              
                in
              
               __init__
            
              ??? StreamHandler.__init__(self, self._open())
            
              ? File 
              
                "/usr/local/lib/python3.6/logging/__init__.py"
              
              , line 1060, 
              
                in
              
               _open
            
              ??? 
              
                return
              
               open(self.baseFilename, self.mode, encoding=self.encoding)
            
              FileNotFoundError: [Errno 2] No such file or directory: 
              
                '//logs/kerry_test.log'
              
            

?

?

?

另外,像密碼過期導致crontab不執行作業(Linux賬號密碼過期會導致crontab作業不能執行)這樣的案例也遇到過,不過這個與Python腳本無關系,如果遇到相關問題,可以從Why-Cronjob-Not-Work這篇文章介紹的這幾個方面去思考、分析判斷。

?

?

參考資料

?

? https://www.tony-yin.site/2018/10/29/Why-Crontab-Not-Work/


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久青草青综合在线视频 | 久久综合偷偷噜噜噜色 | 青青青青久在线观看视频 | 久久综合影院 | 国产精选91热在线观看 | 日韩久久精品一区二区三区 | 国产亚洲精品看片在线观看 | 九九视频高清视频免费观看 | 中文字幕色婷婷在线视频 | 夜夜操美女 | 狠狠色噜噜狠狠狠狠97影音先锋 | 免费黄色视屏网站 | 国内精品51视频在线观看 | 奇米在线观看 | 免费一级在线 | 婷婷五月色综合香五月 | 国产成人精品在线 | 亚洲国产精品久久精品成人 | 国产在线日韩 | 国产成人亚洲精品乱码在线观看 | 日本中文一二区有码在线观看 | 亚洲精品欧美日韩 | 天天操天天舔 | 在线高清一级欧美精品 | 免费看一级a一片毛片 | 亚洲视频一区在线 | 六月丁香色婷婷 | 欧美国产成人一区二区三区 | 四虎影视国产精品永久在线 | 国产成社区在线视频观看 | 天天爽夜夜爽人人爽 | 久久精品国产屋 | 天天天操操操 | 一级日本特黄毛片视频 | 四虎一区 | 99免费在线播放99久久免费 | 日本一级毛片不卡免费 | 精品久久久久久中文字幕欧美 | 一区二区三区四区产品乱码伦 | 欧美成人高清 | 国产野花视频天堂视频免费 |