如何使用现有环境变量运行 cron 命令?

cwd*_*cwd 145 shell cron environment-variables

如何使用现有环境变量运行 cron 命令?

如果我在 shell 提示符下,我可以输入echo $ORACLE_HOME并获取路径。这是在我的~/.profile. 但是,似乎~/.profile没有从 cron 脚本加载,因此我的脚本失败,因为$ORACLE_HOME未设置变量。

这个问题中,作者提到创建一个~/.cronfile配置文件,为 cron 设置变量,然后他做了一个解决方法,将他的所有 cron 命令加载到他保存在他~/Cron目录中的脚本中。像~/.cronfile这样的文件听起来是个好主意,但其余的答案似乎有点麻烦,我希望有人能告诉我一种更简单的方法来获得相同的结果。

我想在我的脚本开始时我可以添加类似的东西,source ~/.profile但这似乎是多余的。

那么我怎样才能让我的 cron 脚本从我的交互式 shell 配置文件中加载变量呢?

Arc*_*ege 183

在 crontab 中,在您发出命令之前,添加. $HOME/.profile. 例如:

0 5 * * * . $HOME/.profile; /path/to/command/to/run
Run Code Online (Sandbox Code Playgroud)

Cron对你的外壳一无所知;它是由系统启动的,所以它有一个最小的环境。如果你想要任何东西,你需要自己带进来。

  • `.` 命令是 `source` 的原始命令。它们在 shell 中是等效的,并且更容易键入,尤其是在 crontab 中。要获取更多信息,请键入“help .”或在“bash”的手册页或“man `zshbuiltins”顶部搜索“^SHELL BUILTIN COMMANDS”。运行 `type .` 会告诉你该命令是一个内置命令。 (27认同)
  • 脚本前的`.` 有什么作用?(不知道我会如何`男人`)。为什么这与 `source` 不同? (20认同)
  • 根据 Linux 发行版,您可能需要通过 `.bash_profile` 更改 `.profile`。检查用户的主目录中存在哪个 `.profile` 文件。 (10认同)
  • 如果它不起作用,很可能是因为 cron 脚本的 SHELL 未设置为 bash,因此它的执行方式与您预期的不同。 (4认同)

小智 55

我发现另一个更简单的选择是使用 cron 运行脚本并在脚本中设置环境。

在 crontab -e 文件中:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh
Run Code Online (Sandbox Code Playgroud)

在 cron_job.sh 文件中:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
Run Code Online (Sandbox Code Playgroud)

.bash_profile 源之后的任何命令都将拥有您的环境,就像您登录一样。

  • 在 AWS Linux AMI 上运行时,我什至没有想到 cron 不会使用 `/bin/bash` 作为 shell。我一直想知道为什么像`cd /path/to/project; source .vars` 在我手动输入它们时可以工作,但是当包含在 cronjob 中时会失败(`File not found`)。对我来说,关键是设置 `SHELL=/bin/bash`,这样我就可以在每个 cronjob 中实际使用熟悉的 bash 命令。`/bin/sh/`(显然是默认的 cron shell)是非常有限的。 (7认同)
  • 如果`$SHELL` 是`/bin/sh`,则`source` 命令不存在。改用`.`。 (5认同)

小智 30

我发现另一个更简单的选择是使用 cron 运行脚本并告诉 bash 登录(因此使用/etc/profile.d/...环境定义)

crontab -e文件中:

*/1 * * * * bash -l -c './cron_job.sh'
*/1 * * * * bash -l -c 'php -f ./cron_job.php'
Run Code Online (Sandbox Code Playgroud)

source 之后的任何命令都.bash_profile将拥有您的环境,就像您登录一样。


fpm*_*phy 12

问:如何使用现有环境变量运行 cron 命令?

一般做法是在要从 cron 作业运行的脚本中专门设置所有必需的环境变量。

  • 我完全是为了安全,但也许我可以创建一个文件 `~/.cronvars` 并将其包含在配置文件中以及我的 cron 脚本中。我不想在我运行的每个脚本中硬编码环境变量,因为当路径更改每个文件中的硬编码路径时,不容易维护。似乎这样可以为所需的变量提供一个集中的位置,并且仍然可以防止加载其他变量。 (6认同)

小智 8

这种语法肯定对你有帮助。我不明白语法,但它有效。Oracle 在将 Oracle Configuration Manager 部署到 crontab 时使用此语法,因此,我认为这是一个正确的解决方案。

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以将全局环境变量放入/etc/environment. 它们在 crontab 运行程序时加载。前任 :

env | grep ORACLE_HOME >> /etc/environment
service crontab restart
Run Code Online (Sandbox Code Playgroud)

缺点是它不限于单个用户。在CentOS7下测试