crontab执行与执行用户没有相同的环境变量


20

0 2 */1 * * /aScript >aLog.log 2>&1以“ root”用户身份运行crontab作业,但是我发现env与“ root”用户的env不同,因此我的脚本遇到了不同的运行时行为。

尝试解决的问题是将导出命令放置在rc.d文件中,但仍然没有显示!我最终将导出命令放在aScript本身中。

我的问题是,有没有更好的方法来解决这个问题?以及为什么env丢失了,即使它来自同一用户“ root”?(我通过从根目录运行'crontab -e'来修改crontab)


8
Cron始终在几乎是空的环境下运行。HOME,LOGNAME和SHELL已设置;和非常有限的路径。如果您不想自己设置所有变量,则可以访问source(bash)配置文件。
cyberx86

2
@ cyberx86:为什么不把它写成答案并得到代表?
user9517支持GoFundMonica

2
@Iain:代表总是很受欢迎-但是有时候感觉像是一行答案并不能真正赢得代表。我完全接受一个简洁的答案,但是当我想提供一些帮助时,我一直(也许是错误地)将评论作为“轻松的出路”,但没有写出完整而详细的解释(当时是凌晨1点。 ..)。但是,我会听取您的建议,并在此基础上再扩展一点,并将其添加为答案。
cyberx86

@ cyberx86:拥有一支正确的衬里总比不正确或什么都不做要好。
user9517支持GoFundMonica 2011年

Answers:


31

Cron始终在几乎是空的环境下运行。HOME,LOGNAME和SHELL已设置;和非常有限的路径。因此,建议使用完整的可执行文件路径,并在使用cron时导出脚本中所需的任何变量。

您可以使用多种方法在cron中设置环境变量,但是所有这些都等于在脚本中进行设置。

方法1:

在脚本中手动设置所需的每个变量。

方法二:

来源您的个人资料:

. $HOME/.bash_profile(或. $HOME/.profile

(您通常会发现上面的文件还将提供其他文件的来源(例如〜/ .bashrc-> / etc / bashrc-> /etc/profile.d/*)-如果没有,您也可以提供这些文件。)

方法3:

将环境变量保存到文件中(以所需用户身份运行):

env > /path/to/my_env.sh

然后通过您的cron脚本导入:

env - `cat /path/to/my_env.sh` /bin/sh

方法4:

在某些情况下,您可以在中设置全局cron变量/etc/default/cron。但是,这样做存在风险,因为将为所有Cron作业设置这些。


方法2最适用于服务器环境中敏感的东西,这些东西不应该在env var中打入磁盘-密码,API密钥等。对我来说很奇妙,所以谢谢。
美联社

方法4在docker引擎设置env var的docker环境中为我工作。为了使它起作用,我必须将我的环境保存在docker入口点中。完整的解决方案在这里:github.com/rayyanqcri/swarm-scheduler
哈马迪(

您能为我详细介绍方法3吗?当我尝试导入时,我得到了bash: SHELL=/bin/bash: No such file
KuboMD

1

Cron使用指定的用法创建其OWN Shell,它将通过其运行。

因此,如果要保留与用户相同的变量,请尝试使用自己的用户而不是root或任何其他用户运行它。

要么

最好的方法是在自己的脚本中导出这些变量。


1

在RedHat CentOS中,您可以将/etc/rc.d/init.d/functions的默认PATH设置为永久设置。/etc/rc.d/crond启动时会调用函数。


0

我的AWS上有一个类似的问题。这样想出来

which python3

给我/usr/bin/local/python3位置

然后

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.