Hits: 327
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
Comments