如何使用现有环境变量运行 cron 命令?
如果我在 shell 提示符下,我可以输入echo $ORACLE_HOME
并获取路径。这是我的环境变量之一,在我的~/.profile
.但是,似乎~/.profile
没有从 cron 脚本加载,因此我的脚本失败,因为$ORACLE_HOME
未设置变量。
在这个问题作者提到创建一个~/.cronfile
为 cron 设置变量的配置文件,然后他采取了一种解决方法,将所有 cron 命令加载到他保存在~/Cron
目录中的脚本中。像这样的文件~/.cronfile
听起来是个好主意,但答案的其余部分似乎有点麻烦,我希望有人能告诉我一种更简单的方法来获得相同的结果。
我想在我的脚本开始时我可以添加类似的内容,source ~/.profile
但这似乎可能是多余的。
那么我怎样才能让我的 cron 脚本从我的交互式 shell 配置文件加载变量呢?
答案1
在 crontab 中,在执行命令之前,添加. $HOME/.profile
.例如:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
Cron
对你的 shell 一无所知;它是由系统启动的,所以它有一个最小的环境。如果你想要什么,你需要自己带进来。
答案2
我发现更容易的另一个选择是使用 cron 运行脚本并在脚本中包含环境。
在 crontab -e 文件中:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
在 cron_job.sh 文件中:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
.bash_profile 源之后的任何命令都将具有您的环境,就像您登录一样。
答案3
我发现更简单的另一个选择是使用 cron 运行脚本并告诉 bash 登录(因此使用/etc/profile.d/...
环境定义)
在crontab -e
文件中:
*/1 * * * * bash -l -c './cron_job.sh'
*/1 * * * * bash -l -c 'php -f ./cron_job.php'
源之后的任何命令.bash_profile
都将具有您的环境,就像您登录一样。
答案4
这个语法绝对对你有帮助。我不明白语法,但它有效。 Oracle 在将 Oracle Configuration Manager 部署到 crontab 时使用此语法,因此,我相信这是一个正确的解决方案。
0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters