我有一个crontab每小时运行一次。运行它的用户在.bash_profile中有环境变量,当用户从终端运行作业时,这些环境变量是有效的,然而,显然这些环境变量在crontab运行时不会被拾取。

我已经尝试在.profile和.bashrc中设置它们,但它们似乎仍然没有被拾取。有人知道我可以把crontab可以获取的环境变量放在哪里吗?


当前回答

对我来说,我必须在NodeJS文件中指定路径。

// did not work!!!!!
require('dotenv').config()

而不是

// DID WORK!!
require('dotenv').config({ path: '/full/custom/path/to/your/.env' })

其他回答

从命令行运行crontab -e时,可以在crontab本身中定义环境变量。

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

此特性仅适用于特定的cron实现。Ubuntu和Debian目前使用vixie-cron,它允许在crontab文件中声明这些(也可以是GNU mcron)。

Archlinux和RedHat使用cronie,它不允许声明环境变量,并且会在cron.log中抛出语法错误。每个条目都可以采取变通措施:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

另一种方式-受此启发-“注入”变量如下(fcron的例子):

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

从帮助集:

-a标记已修改或创建用于导出的变量。 使用+而不是-会导致这些标志被关闭。

因此,set -和set +之间的所有内容都被导出到env中,然后可用于其他脚本,等等。如果不使用set,变量将只存在于set中。

除此之外,当程序需要一个非根帐户来运行,但你需要在其他用户的环境中使用一些变量时,传递变量也很有用。下面是一个传入nullmailer vars来格式化电子邮件头的例子:

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck

不幸的是,crontab的环境变量范围非常有限,因此每次运行corntab时都需要导出它们。

一个简单的方法是下面的例子,假设你的env变量在一个名为env的文件中,然后:

* * * * * ../env && /path/to_your/command

此部分. ./env将导出它们,然后在您的命令的相同范围内使用它们

对我有用的(基于debian):

创建一个包含所有需要的env变量的文件: # !/bin/bash env | grep VAR1= > /etc/environment . env | grep VAR1= > /etc/environment . env | /etc/environment . env | grep VAR2= >> /etc/environment . env | grep VAR3= >> 然后,通过在调用需要它的脚本之前调用env文件来构建crontab内容,从而启动cron服务 (crontab -l;Echo '* * * * *。/etc/environment;/usr/local/bin/python /mycode.py >> /var/log/cron-1.log 2>&1') | crontab 服务cron启动

注意:对于python用例,一定要调用整个python路径,否则可能会调用错误的python,产生无意义的语法错误

全局设置env

sudo sh -c "echo MY_GLOBAL_ENV_TO_MY_CURRENT_DIR=$(pwd)" >> /etc/environment"

添加计划作业以启动脚本

crontab -e

  */5 * * * * sh -c "$MY_GLOBAL_ENV_TO_MY_CURRENT_DIR/start.sh"

=)