在 cronjob 中加载用户环境变量

Seb*_*rth 5 ubuntu bash environment-variables cron

如何在 cronjob 中加载用户环境变量?


我有一个 cronjob,它应该在我的 Ubuntu 机器上每分钟启动一个脚本:

* * * * * /home/user/myscript.sh;
Run Code Online (Sandbox Code Playgroud)

在此脚本中,我想使用 和 等环境变量$JAVA_HOME$M2_HOME自动启动构建过程。问题是这些变量是在.bashrcvia中设置的export JAVA_HOME=/../..

source因此,在执行我的脚本之前我需要这些文件:

* * * * * source ~/.bash_profile; source ~/.bashrc; /home/user/myscript.sh;
Run Code Online (Sandbox Code Playgroud)

但是,变量尚未设置!为了测试这一点,我将echo环境变量添加env到日志文件中:

env >> ~/env.log
echo $M2_HOME >> ~/env.log
Run Code Online (Sandbox Code Playgroud)

日志文件仍然不包含变量。仅将以下内容附加到文件中(无$M2_HOME等):

LANGUAGE=en_US:en
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/user
Run Code Online (Sandbox Code Playgroud)

如果我在 shell 中运行脚本,所有变量都会打印到env.log.

source当我将命令放入脚本文件中时,也会发生同样的情况。仅当我export在变量声明之前删除关键字时,命令才可以看到该关键字echo $var。但这不是解决方案,因为我不管理这些声明。


我尝试了@tripplee的解决方案与有限的sh shell问题,但它仍然不起作用。我进一步将其简化为一个非常简单的 cronjob,无需第二个脚本来显示问题:

* * * * * . $HOME/.bash_profile; . $HOME/.bashrc; env > $HOME/env.log;
Run Code Online (Sandbox Code Playgroud)

cat /home/user/env.log:

LANGUAGE=en_US:en
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/user
Run Code Online (Sandbox Code Playgroud)

tri*_*eee 4

cron 作业语法仅限于,sh因此您不能使用像~. 幸运的是,修复很简单——只需将其替换为$HOME. 同样,source需要替换为.(只是一个点)。

当然,如果您打算从sh. 也许最简单的解决方法是将这些内容迁移到您的脚本中(或创建一个包装脚本以供 Cron 运行)。

因为在您的脚本中,如果您愿意,您可以使用bash,当然前提是 shebang 行正确#!/bin/bash(如果需要,请调整路径)而不是#!/bin/sh.

如果由于某种原因您不喜欢这样,您可以crontab通过显式指定将 Bash 内联到您的文件中:

* * * * * bash -c 'source ~/.bash_profile; source ~/.bashrc; ./myscript.sh'
Run Code Online (Sandbox Code Playgroud)

当出现问题时,您应该能够在发送的电子邮件中看到source: command not found和。检查错误输出对于故障排除非常重要。export: command not foundcron

当然,如果您.bashrc在 Ubuntu 上有标准,那么当您尝试从非交互式脚本获取它时,它会立即退出。也许更好的方法是将您想要的设置放在另一个文件中以非交互方式使用(也许默认情况.profile下会读取该文件sh)?