我想读取 crontab 中的环境变量。
我尝试从 crontab 运行 printenv,它运行良好:
* * * * * BASH_ENV=/etc/profile bash -c "printenv CNE_CLUSTER_NAME >> output.txt"
我需要运行一个由 python 脚本执行一些操作的作业。我把它安排在 crontab 中,如下所示:
* * * * * BASH_ENV=/etc/profile bash -c "/usr/bin/python3 /var/cne/cluster/$(echo $(printenv CNE_CLUSTER_NAME))/scripts/setup/job.py"
但是从 crontab 运行时 var CNE_CLUSTER_NAME 为空
python3: can't open file '/var/cne/cluster//scripts/setup/job.py': [Errno 2] No such file or directory)
那么,我该如何读取变量或替换字符串中的值变量?请。
您不需要
printenv
即可访问 CNE_CLUSTER_NAME
的值。
* * * * * BASH_ENV=/etc/profile bash -c '/usr/bin/python3 /var/cne/cluster/$CNE_CLUSTER_NAME/scripts/setup/job.py'
$CNE_CLUSTER_NAME
按字面意思传递,执行该命令的 shell 会将参数扩展为在其环境中找到的值。
我面临着类似的挑战,并发现了一种解决方案,可以有效地为每个 cron 作业设置环境变量,这至关重要,因为每个 cron 作业都在新的环境中启动,并且每个 cronjob 可能需要不同的变量。我创建了一个由 cron 执行的
.sh
脚本,在运行 Python 脚本之前设置必要的环境。这是一个示例脚本:
#!/bin/zsh
export PATH=/usr/bin:/bin:/usr/sbin:/sbin # set your paths.
# set any other env variable, or execute any other action to init the cron env.
/Users/me/.pyenv/shims/python /Users/me/my-script.py
设置说明:
PATH
的输出设置 echo $PATH
。which python
找到。确保此脚本可以通过
chmod +x my-cron.sh
执行。
您的 Python 脚本不需要任何特殊的标头或元数据,例如:
import subprocess
import json
# ... rest of the python script.
使用
pyenv shims
管理 Python 版本和依赖项,使用 pyenv global 3.9.18 3.11.5
设置全局 Python 版本。其他 python 管理解决方案也可以工作。
要将其添加到您的 crontab:
crontab -e
打开 crontab。*/1 * * * * /Users/me/my-cron.sh
。 (此示例将每分钟运行一次)ESC
,输入 :wq
(write, quit),然后按 Enter
。您将看到一条确认消息:“crontab:安装新的 crontab”。此方法可确保您的 Python 脚本在正确的环境和依赖项下运行,由
pyenv
管理。