shell脚本中使用的环境变量在由cron运行时在日志文件中显示为空白

Ste*_*ven 3 linux shell scripting environment-variables

原谅我的无知,但我对shell脚本和在Linux中使用环境变量有些新意.

我有一个执行MySQL数据库备份的脚本.我在脚本中有以下几行用于记录数据库的成功转储:

output=`date; echo "Database export successful from $ENV_HOSTNAME to $BACKUP_HOSTNAME"`
echo $output >> /var/log/errorLog
Run Code Online (Sandbox Code Playgroud)

我在/ etc/profile中定义了变量(ENV_HOSTNAME和BACKUP_HOSTNAME),如下所示:

export ENV_HOSTNAME="env1.somename.com"
export BACKUP_HOSTNAME="env2.somename.com"
Run Code Online (Sandbox Code Playgroud)

当我调用printenv时,我可以看到列出的这些变量,并且当我运行此脚本(以root身份)时,变量值正确显示在日志文件中.但是,当我将此脚本设置为使用cron运行时,变量值不会出现在日志文件中.我知道脚本运行是因为我可以看到日期和字符串的其余部分,但变量是空白的:

Fri Nov 6 22:31:05 EST 2009 Database export successful from to
Run Code Online (Sandbox Code Playgroud)

我确定我在这里遗漏了一些简单的东西,所以请提前感谢您的帮助.

Car*_*icz 5

有你的问题:cron没有运行/ etc/profile.

cron只用很少的环境设置启动; 你需要的任何其他东西,你必须自己设置,所以习惯上让cron调用脚本来处理设置,然后是主要动作.

  • 我通常喜欢这个,而不是盲目地运行你的个人资料 - 每个cron工作应该完全负责设置它的环境.你的cron工作应该运行他们需要的东西*而不是更多*.这使得调试变得更加容易(我总是可以在你的脚本中放置一个"env> /tmp/cron.env"来查看它运行的内容). (2认同)

Rob*_*lls 5

天儿真好,

当cron执行它时,它只给你一组最小的env.瓦尔.

一个技巧是创建一个包含要设置的变量的shell脚本,然后让所有cron脚本在启动时获取该脚本.

例如,在正在运行的cron脚本的顶部添加以下内容.

. my_cronenv.sh

您的shell脚本my_cronenv.sh应该导出您要为cron作业设置的所有变量.

编辑:忘了说这个的另一优点是你只需要更改一个脚本,如果你正在运行你的cronjobs的环境发生了变化,而不是必须搜索一堆cron脚本来制作相同的编辑.

另一件事是养成一直提到你的环境的习惯是个好主意.使用大括号的vars.例如,$ {ENV_HOSTNAME}而不是$ ENV_HOSTNAME.

养成这种习惯意味着当你使用环境变量的值时,你不会被抓住.例如,$ {ENV_HOSTNAME} _RSV将按预期扩展,而不是$ ENV_HOSTNAME_RSV.注意在某些系统上,单个字母变量可以在没有括号的情况下按预期工作,但我发现更好地养成习惯.它还使您的shell脚本的任何未来读者都明白您的意图.

干杯,