首页 文章

环境变量当cron运行python脚本时

提问于
浏览
22

我一直在寻找其他堆栈溢出问题,但无法工作 . 我有一个使用环境变量的python脚本 . 这个脚本在直接运行时完全按计划运行,但是我想暂时每分钟将它作为一个cron作业运行 .

目前在我的cron.d目录中,我有一个名为scrapers的文件,其中包含:

* * * * * root /usr/bin/python3.5 /code/scraper.py

这会运行python脚本,但脚本会失败,因为在脚本中我使用了两个环境变量 .

我读过我应该将SHELL = / bin / bash添加到cron文件中,所以我做了但这没有用 .

SHELL=/bin/bash
* * * * * root /usr/bin/python3.5 /code/scraper.py

然后我读了

在crontab中,在命令之前添加 . $ HOME / .profile文件 .

SHELL=/bin/bash
* * * * * . $HOME/.profile; root /usr/bin/python3.5 /code/scraper.py

但这导致cron完全停止运行 . 将env变量“发送”到cron的最佳方法是什么?

5 回答

  • 2

    我不会执行整个 ~/.profile ,而是移动必须在 cron 作业和具有该配置文件的帐户之间共享的变量,然后我将在 ~/.profile 和cron作业中同时提供这些变量 .

    您在问题中显示的最后一次尝试未正确格式化 . 用户ID应该在调度信息之后,但是您已经在用户ID之前添加了配置文件的源,这肯定无法工作 .

    这是我在这里测试过的示例设置:

    */1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py
    

    我已将其设置为每分钟执行一次以进行测试 . 用有意义的东西替换 someuser . 我使用的 /tmp/t10/setenv 脚本有这个:

    export FOO=foovalue
    export BAR=barvalue
    

    /tmp/t10/test.py 文件有这个:

    import os
    
    print os.environ["FOO"], os.environ["BAR"]
    

    我的cron通过电子邮件发送了它运行的脚本的输出 . 我收到了一封包含此输出的电子邮件

    foovalue barvalue
    
  • 4

    您可以将env变量设置为内联:

    * * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py

    另一种方法是使用honcho,您可以传递带有env变量的文件 .

    honcho -e /path/to/.env run /code/scraper.py

  • 1

    您可以通过以下方式指定两个环境变量:

    * * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py
    

    env 是一个运行带有其他变量的指定程序的系统程序:

    $ env A=1 B=2 /bin/sh -c 'echo $A$B'  # or just 'sh': would search in $PATH
    12
    
  • 0

    这是我喜欢的方法之一,编写脚本来设置环境并以其参数作为参数执行脚本

    set_env_to_process.sh

    #!/usr/bin/env bash
    echo "TEST_VAR before export is: <$TEST_VAR>"
    
    export TEST_VAR=/opt/loca/netcdf
    echo "TEST_VAR after export is: <$TEST_VAR>"
    export PATH=$PATH:/usr/bin/python3.5
    export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath
    
    # execute command and its parameters as input for this script
    if [ $# -eq 0 ]; then
        echo "No command to execute"
    else
        echo "Execute commands with its parameters: $@"
        eval $@
    fi
    

    用法

    /usr/bin/python3.5 /code/scraper.py 被视为 set_env_to_process.sh set_env_to_process.sh 的输入,为脚本运行设置正确的env

    它可以用作命令行,cron,sudo,ssh来设置env

    * * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py
    
  • 0

    您可以将它添加到crontab的顶部,并使其不受版本控制 . 假设导致您遇到困难的环境变量是 export DJANGO_SECRET_KEY="FOOBAR_1241243124312341234"

    crontab

    DJANGO_SECRET_KEY="FOOBAR_1241243124312341234"
    
    SCRIPT_NAME = my_cool_script
    20 21 * * 1-5 bash ~/git_repo/cronjobs/$SCRIPT_NAME.sh 2&>1 | tee ~/git_repo/cronjobs/logs/$SCRIPT_NAME.log
    

    my_cool_script.sh

    #!/usr/bin/env bash
    ~/anaconda3/envs/django/bin/python ~/git_repo/django_project/manage.py run_command
    

    当有问题的环境变量需要保密并且现有.bashrc的加载因任何原因不能很好时,这对我来说效果很好 .

相关问题