我的 Python 脚本使用环境变量,环境变量由 Azure
configmap
设置,并且可以从 pod 命令提示符访问它们。当我在 pod 命令行上手动运行时,它们也可用于 Python,但当程序按 crontab
计划运行时,环境变量可用。它失败并出现以下错误。
Traceback (most recent call last):
File "/app/fraudblk.py", line 6, in <module>
from someLib import SomeFunc
File "/app/someLib .py", line 920, in <module>
userName = os.environ["CSI_USER"]
~~~~~~~~~~^^^^^^^^^^^^
File "<frozen os>", line 714, in __getitem__
KeyError: 'CSI_USER'
尝试使用Python 3.7。
您在 crontab 计划中遇到环境变量
KeyError
的主要原因是 crontab 不像 shell 会话或正在运行的应用程序那样继承环境变量。这意味着虽然这些变量在手动运行 Python 脚本时可用,但默认情况下,当脚本通过 crontab 运行时它们不可用。要解决这个问题,您需要确保 crontab 可以访问 ConfigMap 设置的环境变量。
解决方法 - 在 Crontab 中手动设置环境变量
kubectl exec -it <podname> -- /bin/bash
printenv | grep CSI
将相关环境变量(
CSI_USER
,CSI_PASS
)复制到你的crontab中
* * * * * CSI_USER=my-user CSI_PASS=my-pass /usr/bin/python3 /app/fraudblk.py >> /tmp/output.log 2>&1
这会在 crontab 中运行脚本之前显式设置环境变量。
这是最简单的方法。但是,还有其他两种方法。如果你愿意的话,你可以检查一下—— 一种是从 crontab 条目中的
/proc/1/environ
获取环境变量
* * * * * . /proc/1/environ && /usr/bin/python3 /app/fraudblk.py >> /tmp/output.log 2>&1
另一种方法是创建一个脚本来获取环境变量并运行 Python 脚本,然后通过 crontab 运行该脚本
示例-
#!/bin/bash
. /proc/1/environ
/usr/bin/python3 /app/fraudblk.py
保存并使其可执行
chmod +x run_script.sh
修改 crontab 条目以运行此脚本
* * * * * /app/run_script.sh >> /tmp/output.log 2>&1
查看此文档