crontab中部署Python腳本註意事項

来源:https://www.cnblogs.com/kerrycode/archive/2019/08/20/11386074.html
-Advertisement-
Play Games

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


有時候手工執行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

 

clip_image001

 

 

還有一種方案,就是使用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)  # 設置屏幕上顯示的格式
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要做介面測試 在日常開發過程中,有人做前端開發,有人負責後端開發。介面就是連接前後臺,由於前端開發和後端開發的速度可能不一樣,例如後端開發好了,但是前端沒有開發。那麼我們是不是就不需要測試呢?一般我們大部分人都是做功能測試,很多是界面的功能測試。如果你理解了介面測試,那麼你就可以針對介面進行測 ...
  • vuex 1,什麼是 vuex? vuex 是一個專門為 vue.js 應用程式 開發的狀態管理模式+庫 它充當應用程式中所有組件的集中存儲(數據狀態) ,其規則確保狀態只能以可預測的方式進行變更 並且 組件狀態 和 後臺數據 都是響應的 2,vuex使用方法? - 下載:$ npm i vuex ...
  • #基於webpack構建的 Koa2 restful API 伺服器腳手架 這是一個基於 Koa2 的輕量級 RESTful API Server 腳手架,支持 ES6, 支持使用TypeScript編寫。 GIT地址:https://github.com/Allenzihan/koa2-mysql ...
  • 關於Django ModelForm渲染時間格式問題 直接定義DateTimeInput或者DateTimeFile是不行的,渲染在html頁面中的仍然是Input text類型 解決辦法:自定義小部件 然後設置widgets 此時渲染出來的頁面就是 ...
  • 5.1.如何派生內置不可變類型並修其改實例化行為 修改實例化行為 5.2.如何為創建大量實例節省記憶體 定義類的__slots__屬性,聲明實例有哪些屬性(關閉動態綁定) 5.3.如何創建可管理的對象屬性 一般寫法 用property裝飾器 ...
  • 索引是幫助MySQL高效獲取數據的排好序的數據結構 索引數據結構對比 二叉樹 左邊子節點的數據小於父節點數據,右邊子節點的數據大於父節點數據。 如果col2是索引,查找索引為89的行元素,那麼只需要查找兩次,就可以獲取到行元素所在的磁碟指針地址。 如果col1是索引,查找索引為6的行元素,那麼需要查 ...
  • 到目前為止,我們整個初級廣告檢索系統就初步開發完成了,我們來整體回顧一下我們的廣告系統。 整個廣告系統編碼結構如下: 1. 父模塊 主要是為了方便我們項目的統一管理 2. 這個模塊主要有2個作用,本身只應該作為資料庫腳本管理package來使用,但是我們在生成索引文件的過程中,為了方便,我就直接將導 ...
  • 所謂的列表推導式,就是指的輕量級迴圈創建列表。 基本使用方式 上面的列表推導式等價於下麵,只是代碼非常簡化。 在迴圈的過程中使用if 等價於 2個for迴圈 等價於 練習 生成一個[[1,2,3],[4,5,6]....]的列表最大值在100以內 首先考慮一下正常情況我們應該怎麼寫 然後再把它轉換成 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...