Iva*_*nik 0 linux bash shell cron
我们都知道 cron 会忽略“.bashrc”和“.bash_profile”中定义的变量,所以我们必须在 cron 中定义它。我经常做同样的事情写在类似的问题https://unix.stackexchange.com/questions/67940/cron-ignores-variables-defined-in-bashrc-and-bash-profile但仍然是 .bashrc 中的全局变量还是行不通。我找到了执行它的方法 - 通过使用“set +a”bashrc 脚本定义 sh 脚本。但是“源”仍然不起作用。
SHELL=/bin/bash
BASH_ENV=/root/.bashrc
PATH=:/opt/spark/spark-2.2.0-bin-hadoop2.7/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
SPARK_HOME=/opt/spark/spark-2.2.0-bin-hadoop2.7
MAILTO=root HOME=/
# m h dom mon dow command
* * * * * /bin/bash -c 'source $HOME/.bashrc; echo "SPARK_HOME: '$SPARK_HOME'"; echo "JAVA_HOME: '$JAVA_HOME'"' > /var/log/file.log 2>&1
# DO NOT DELETE LAST LINE
Run Code Online (Sandbox Code Playgroud)
返回日志文件
SPARK_HOME: /opt/spark/spark-2.2.0-bin-hadoop2.7
JAVA_HOME:
Run Code Online (Sandbox Code Playgroud)
还尝试以交互模式执行此操作,因为它是由 mklement0
源 .bashrc 在脚本中编写的不起作用
* * * * * /bin/bash -i source /root/.bashrc; echo $JAVA_HOME > /var/log/file.log 2>&1
Run Code Online (Sandbox Code Playgroud)
如您所见,SPARK_HOME 是在 crontab 中定义的,而 JAVA_HOME 仅在 .bashrc 中定义。bashrc java home 中的 PS 定义为“export JAVA_HOME=/usr/jdk1.8.0_131”当我将 JAVA_HOME 更改为 SPARK_HOME 时,所有不同的 cron 作业都可以正常工作,尝试了不同的 crontab 作业,但答案与以前相同。
ubuntu 内核版本是
uname -a
Linux 6101c32b9243 4.9.62-21.56.amzn1.x86_64 #1 SMP Thu Nov 16 05:37:08 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
您的最后一次尝试运行bash并获取文件,然后退出 Bash 并echo在调用 shell 中运行,这不是 Bash,当然不知道或不关心现已解散的 Bash 进程加载了一些设置,然后在什么时候忘记了它们它退出了。(或者,好吧,如果您修复简单的引用错误以将source命令及其参数保留为单个字符串,就会发生这种情况。)
表面修复很容易;
* * * * * bash -c 'source $HOME/.bashrc; echo "$JAVA_HOME"' >/var/log/file.log 2>&1
Run Code Online (Sandbox Code Playgroud)
在适当的修正,然而,可能是封装所有这一切在一个单独的脚本,并保持你的crontab真的很简单。
(你真的确定你的用户被允许覆盖日志文件吗?每分钟更换一次日志似乎相当误导,尽管它足以快速测试以查看作业是否正在运行。)
| 归档时间: |
|
| 查看次数: |
4486 次 |
| 最近记录: |