[linux] 關於自動化工作 (crontab) 的二三事

點閱: 50

crontab 的設定

紀錄一下使用 crontab 自動化工作發生的問題

問題描述

當我登入 linux server 時,可以直接執行 python 的程式,但透過 crontab 執行的時候,就會出錯。追查了原因發現,crontab 是透過 server 的 root 執行,會最小限度的給予環境變數,因此造成在 shell 中執行程式的結果與 crontab 執行的結果不同(參考文章)。

Debug 過程

  • 首先觀察透過 crontab 執行命令時的環境變數有哪些:可以發現環境變數非常的少,我會用到的 ORAHOME, ORACONF, NLS_LANG … 等通通都沒有
# crontab.sh
#!/bin/bash
cd $HOME/oth015_converter
source $HOME/oth015_converter/my_env.sh
echo env
deactivate

# output
LANG=en_US.UTF-8
OLDPWD=/path
VIRTUAL_ENV=/path/venv
PWD=/path
HOME=/path
SHELL=/bin/sh
SHLVL=1
LOGNAME=syscc
PATH=/path/venv/bin:/usr/bin:/bin
PS1=(venv)
_=/usr/bin/env
  • 將環境變數輸出至專案目錄底下,命名為 my_env.sh
cd /path_to_project/
export -p > my_env.sh
  • 讓 crontab 在每次執行時都使用 shell 的環境變數
# crontab.sh

#!/bin/bash
cd $HOME/project
source $HOME/project/my_env.sh  # import env
source $HOME/project/venv/bin/activate
python main.py
deactivate

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts