我已经设置了一些environ
变量,但当脚本由运行时,.bashrc
它们最终会变成这样。当我使用运行时,它可以完美运行。None
cron
python3
设置变量:
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"