歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下通過crontab調度腳本時腳本所使用的環境變量問題

Linux下通過crontab調度腳本時腳本所使用的環境變量問題

日期:2017/3/1 13:37:21   编辑:關於Linux
通過crontab調度腳本時腳本使用的環境變量與直接在shell中運行腳本時使用的環境變量不同(因為crontab並不知道你所使用的shell,只是簡單的設置了HOME、LOGNAME、SHELL和有限的PATH等環境變量),因而可能導致“XXX command not find”的錯誤或者運行結果不一致的情況。


解決辦法有四:
1.在腳本中設置環境變量,如,在cron_job.sh文件中:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

當然也可以先把環境變量設置在一個單獨的文件中如/path/to/my_env.sh
$ env | sort > /tmp/cmdLineEnv.out(注意使用運行腳本時所使用的用戶執行命令)
然後在待運行的腳本中執行`cat /path/to/my_env.sh`
2.在腳本中使用絕對路徑運行命令
可避免PATH環境變量導致的命令無法找到的問題,但不能避免其他環境變量造成的問題。

3.在crontab文件中設置調度腳本時使用的環境變量信息,如:
SHELL=/bin/bash
LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
PATH = /sbin
0 5 * * * sleep 5s && echo "yo"

使用此方法需注意:
在crontab文件的頂部設置
該特征僅對某些特定的cron的實現有效(如Ubuntu和Debin的vixie-cron、GNU mcron支持這一特性,而Archlinux和Redhat的cronie不支持這一特性)

4.在調度語句中設置環境變量,如:
0 5 * * * . $HOME/.profile; sleep 5s && echo "yo"

使用此方法需注意:
“.”表示source命令,不可忽略,當然,也可以直接以“source”命令替代“.”
真實情況下應將“$HOME”替換為實際的全路徑
保存環境變量的文件可以是$HOME/.profile,還可能是$HOME/.bash_profile、/etc/profile等或者是自己特意創建的專門用來存放環境變量的文件。

也可以直接在調度語句中設置環境變量,如:
0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters

或者寫一個封裝腳本封裝設置環境變量的命令如cron-wrapper
#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"
然後在計劃任務調度語句中
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh

參考
http://www-01.ibm.com/support/docview.wss?uid=isg3T1011623
Copyright © Linux教程網 All Rights Reserved