Ubuntu:在 .bashrc 中设置了环境变量但未在 cron 中使用?

Ubuntu:在 .bashrc 中设置了环境变量但未在 cron 中使用?

我已经设置了一些environ变量,但当脚本由运行时,.bashrc它们最终会变成这样。当我使用运行时,它可以完美运行。Nonecronpython3

设置变量:

nano .bashrc

.bashrc

export NBB="Hello"

当我在 shell 中执行:python3

os.environ.get('NBB')

打印你好

在 cron 中运行相同的脚本:

os.environ.get('NBB')

输出:无

我是否应该将变量设置在其他地方?

答案1

与 bash 文档中所述一致

Execute commands from file instead of the standard personal initialization file ~/.bashrc if the shell is interactive

关键部分: 如果 shell 是交互式的,则为 ~/.bashrc

即使您以自己的用户身份运行 cron(而不是像大多数常见示例那样以 cron 用户身份运行),cron 也不是交互式的。

答案2

假设你的 cronjob 目前位于

/full/path/to/my/original/process/launched/by/cron

让我们创建一个新文件 /full/path/to/this/defineVars 并在其中填充如下行

export foo=bar                      #  give this your actual env var definition
export yetAnotherVar=someCoolValue  #  ditto

保存此文件,确保 = 符号周围没有空格,如果环境变量的值包含空格或类似内容,则用单引号引起来

现在创建一个名为 /full/path/my/wrapperToCronjob 的新包装文件

vi /full/path/my/wrapperToCronjob # 编辑此文件并提供以下内容

source /full/path/to/this/defineVars  #  jack up local environment with vars

/full/path/to/my/original/process/launched/by/cron

现在通过发出以下命令使新的包装器可执行

chmod +x /full/path/my/wrapperToCronjob  

更新您的 cronjob 以执行文件 /full/path/my/wrapperToCronjob 而不是 /full/path/to/my/original/process/launched/by/cron

本质上,上面所做的是创建一个包含所有环境变量定义的文件...然后从包装器 bash 脚本中获取此文件,然后执行 cron 最初直接启动的原始进程...然后更新 cronjob 以执行此包装器脚本而不是原始进程

这种设计模式非常常见,它将环境变量定义分离到自己的文件中,并允许您在包装器脚本中执行其他初步任务,以及在处理完成后从包装器脚本中执行其他后期处理步骤

至关重要的是,这还明确定义了您的流程所需的所有必要环境变量,并允许您的生产用户而不是 root 或您自己的用户运行 cronjob

答案3

.bashrc 是你的配置文件和 cron可能没有像你那样跑步除非您将其设置为。

当你启动 Python 时,它会以你的身份运行。

思考cron 默认以 root 身份运行...(编辑更正)cron 通常以 cron 用户身份运行,但理由是一样的。

尝试设置/etc/environment变量这些将是全系统的。如果这会产生安全问题,请搜索以 root 身份设置环境变量。

答案4

因为我想使用动态环境变量,所以很多解决方案对我来说都不起作用。当我使用 Debian 的 vixie-cron(和 Ubuntu 的)作为我的 bash 脚本时,我发现最好的方法是使用用户的 crontab 的现有环境:

*/5 * * * * "BASH_ENV=$HOME/.profile $HOME/my_bash_script.sh"

相关内容