在 Crontab 中读取环境变量

问题描述 投票:0回答:2

我想读取 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)

那么,我该如何读取变量或替换字符串中的值变量?请。

bash cron
2个回答
0
投票

您不需要

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 会将参数扩展为在其环境中找到的值。


0
投票

我面临着类似的挑战,并发现了一种解决方案,可以有效地为每个 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
  • 使用Python可执行文件的绝对路径,通过
    which python
    找到。
  • 提供 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:

  1. 在终端中使用
    crontab -e
    打开 crontab。
  2. 定义您的 cron 作业和脚本路径,如下所示:
    */1 * * * * /Users/me/my-cron.sh
    。 (此示例将每分钟运行一次)
  3. 要保存并退出,请按
    ESC
    ,输入
    :wq
    (write, quit),然后按
    Enter
    。您将看到一条确认消息:“crontab:安装新的 crontab”。

此方法可确保您的 Python 脚本在正确的环境和依赖项下运行,由

pyenv
管理。

© www.soinside.com 2019 - 2024. All rights reserved.