代码之家  ›  专栏  ›  技术社区  ›  Steven

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

  •  3
  • Steven  · 技术社区  · 15 年前

    请原谅我的无知,但我对shell脚本和Linux中环境变量的使用有些陌生。

    output=`date; echo "Database export successful from $ENV_HOSTNAME to $BACKUP_HOSTNAME"`
    echo $output >> /var/log/errorLog
    

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

    export ENV_HOSTNAME="env1.somename.com"
    export BACKUP_HOSTNAME="env2.somename.com"
    

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

    Fri Nov 6 22:31:05 EST 2009 Database export successful from to
    

    我肯定我错过了一些简单的东西,所以提前谢谢你的帮助。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Carl Smotricz    15 年前

    这是您的问题:cron不运行/etc/profile。

    cron启动时只有很少的环境设置;任何您需要的东西,您都必须自己设置,因此习惯上让cron调用一个脚本来处理设置,然后是主操作。

        2
  •  5
  •   Rob Wells    15 年前

    G'day,

    当cron执行时,它只提供一组最小的env。瓦尔斯。

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

    . my_cronenv.sh

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

    编辑: 我忘了说那个了 大的 这样做的好处是,如果运行cronjobs的环境发生变化,您只需要更改一个脚本,而不必搜索一组cron脚本来进行相同的编辑。

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

    干杯

        3
  •  2
  •   ephemient    15 年前

    贝壳 cron 用于运行作业的是非交互式的,因此不会自动生成源 /etc/profile 或类似文件。

    一个简单的解决方案是简单地添加

    . /etc/profile
    

    在脚本的开头。