【问题标题】:source bashrc doesn't work in cron源 bashrc 在 cron 中不起作用
【发布时间】:2018-06-26 05:28:55
【问题描述】:

我们都知道 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

返回日志文件

SPARK_HOME: /opt/spark/spark-2.2.0-bin-hadoop2.7
JAVA_HOME:

还尝试在交互模式下执行此操作,因为它是由 mklement0
source .bashrc in a script not working

编写的
* * * * * /bin/bash -i source /root/.bashrc; echo $JAVA_HOME > /var/log/file.log 2>&1

如您所见,SPARK_HOME 是在 crontab 中定义的,而 JAVA_HOME 仅在 .bashrc 中定义。 P.S 在 bashrc java home 中定义为“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

【问题讨论】:

    标签: linux bash shell cron


    【解决方案1】:

    您最后一次尝试运行 bash 并获取文件,然后退出 Bash 并在调用 shell 中运行 echo,这不是 Bash,当然也不知道或不在乎现在已经失效的 Bash进程加载了一些设置,然后在退出时忘记了它们。 (或者,好吧,如果您修复了简单的引用错误以将 source 命令及其参数保留为单个字符串,则会发生这种情况。)

    表面上的修复很容易;

    * * * * * bash -c 'source $HOME/.bashrc; echo "$JAVA_HOME"' >/var/log/file.log 2>&1
    

    适当的修复,然而,可能是将所有这些封装在一个单独的脚本中,并保持你的 crontab 非常简单。

    (您确定允许您的用户覆盖日志文件吗?每分钟更换一次日志似乎是错误的,尽管它足以快速测试以查看作业是否正在运行。)

    【讨论】:

    • 非常感谢,我已经尝试了您所写的内容,但它仍然只适用于 $SPARK_HOME 变量。还有什么我可以尝试的吗?)它甚至已经不好笑了。 P.S 覆盖日志仅用于测试。
    • 如果您有两个作业写入同一个文件,显然看起来只有其中一个在工作。但同样,将所有命令放在脚本文件中可能是可行的方法,并且可以消除此类问题。
    • 我只有一份工作。
    • 您的帖子清楚地显示了两个cron 作业几乎同时写入同一个文件。如果这不正确,那么我真的建议您查看troubleshooting help in the Stack Overflow cron tag info page,也许如果您仍然无法弄清楚,请发布一个新问题,详细说明您正在做什么确切以及如何完全正确您得出结论,只能打印一个变量,而不能打印另一个变量。
    • 正如反复建议的那样,将echo "SPARK_HOME: '$SPARK_HOME'"; echo "JAVA_HOME: '$JAVA_HOME'" 放在一个脚本中,并在您从cron 运行此脚本时演示一个已打印而另一个不打印,这将是一个不错的演示。日志条目显示 cron 运行的确切时间应该对诊断有用。
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 2012-09-08
    • 2018-11-13
    • 2015-01-05
    • 2016-11-22
    • 2016-01-23
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多