我在哪里可以设置 crontab 将使用的环境变量?

新手上路,请多包涵

我每小时运行一个 crontab。运行它的用户在 .bash_profile 中有环境变量,当用户从终端运行作业时,这些环境变量会起作用,但是,显然这些不会在运行时被 crontab 拾取。

我已经尝试将它们设置为 .profile.bashrc 但它们似乎仍然没有被接收。有谁知道我可以在哪里放置 crontab 可以获取的环境变量?

原文由 James 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
2 个回答

在运行命令之前让“cron”运行一个设置环境的 shell 脚本。

总是。

 #   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

~/bin/Cron 中的脚本都是指向单个脚本“runcron”的链接,如下所示:

 :       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
#       Commands to be performed by Cron (no debugging options)

#       Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile

base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"$@"}

(使用较旧的编码标准编写 - 现在,我会在开头使用 shebang ‘#!‘。)

’~/.cronfile’ 是我的配置文件中的一个变体,供 cron 使用 - 严格非交互式且没有回声,以免产生噪音。您可以安排执行 .profile 等等。 (REAL_HOME 的东西是我的环境的产物——你可以假装它和 $HOME 一样。)

因此,此代码读取适当的环境,然后从我的主目录执行命令的非 Cron 版本。因此,例如,我的“工作日”命令如下所示:

 :       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

‘daily’ 命令更简单:

 :       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
#       Commands to be done daily

# Nothing -- most things are done on weekdays only

exit 0

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 2.5 许可协议

从命令行运行 crontab -e 时,您可以在 crontab 本身中定义环境变量。

 LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

此功能仅适用于 cron 的某些实现。 Ubuntu 和 Debian 当前使用 vixie-cron ,它允许在 crontab 文件(也是 GNU mcron )中声明这些。

ArchlinuxRedHat 使用 cronie它不允许 声明环境变量,并且会在 cron.log 中抛出语法错误。解决方法可以按条目完成:

 # m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

原文由 carestad 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题