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

如果我在shell提示符下可以键入echo $ORACLE_HOME并获取路径。这是我在~/.profile中设置的环境变量之一。但是,似乎~/.profile无法从fron cron脚本加载,因此我的脚本失败了,因为未设置$ORACLE_HOME变量。 ,然后他做了一个变通办法,将所有cron命令加载到他保存在~/.cronfile目录中的脚本中。像~/Cron这样的文件听起来像是个好主意,但其余答案似乎有点麻烦,我希望有人可以告诉我获得相同结果的更简单方法。在我的脚本中,我可以添加类似~/.cronfile的内容,但这似乎是多余的。

那么如何使我的cron脚本从交互式shell配置文件中加载变量?

评论

如何将源〜/ .profile添加到程序中是多余的?程序从调用程序继承其环境。如果该调用程序不是您的shell,那么子程序将如何获得所需的环境?

我已经在这里写下了对类似问题的答案。它仅使用su -l设置普通登录环境,包括root用户或其他特定用户的$ PATH。

#1 楼

在crontab中,在命令之前添加. $HOME/.profile。例如:它是由系统启动的,因此它具有最小的环境。如果您想要任何东西,则需要将其带入自己。

评论


什么的。脚本之前呢? (不知道我该怎么办)。为什么这与来源不同?

– cwd
2011-12-21 19:26

的。 command是源的原始命令。它们在Shell中是等效的,并且易于键入,尤其是在crontab中。要获取更多信息,请输入help。或在手册页中搜索bash或在zshbuiltins手册顶部的^ SHELL BUILTIN COMMANDS。运行类型.`会告诉您该命令是内置命令。

–Arcege
2011-12-21 19:38

根据Linux发行版,您可能需要通过.bash_profile更改.profile。检查用户的主目录中存在哪个.profile文件。

–冰霜Z
13年5月17日在12:37

如果它不起作用,可能是因为cron脚本的SHELL未设置为bash,所以它的执行方式与您期望的不同。

–丹尼尔·法瑞尔(Daniel Farrell)
15年7月10日在18:32

印象是先采购.profile然后使用;会导致它在实际上没有将其交给命令的另一个进程中运行,因此应作为$ HOME / .profile && / some / command / here完成

– KuboMD
19年7月15日在18:44



#2 楼

我发现更容易的另一种选择是使用cron运行脚本并在脚本中包含环境。

在crontab -e文件中:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh


在cron_job.sh文件中:

评论


在AWS Linux AMI上运行时,我什至没有想到cron不会使用/ bin / bash作为外壳。我一直想知道为什么cd / path / to / project之类的东西;当我手动键入源.vars时,它们可以工作,但包含在cronjob中时,它会失败(找不到文件)。对我来说,关键是设置SHELL = / bin / bash,这样我实际上可以在每个cronjob中使用熟悉的bash命令。 / bin / sh /(显然是默认的cron shell)是非常有限的。

–哈特利布罗迪
2016年9月9日14:05

太糟糕了,您无法像在cron顶部那样指定环境文件,就像您可以指定单个环境变量一样。 Systemd有一个EnvironmentFile服务单元。太糟糕的cron没有类似的东西。

– radtek
18年1月30日在20:19

如果$ SHELL是/ bin / sh,则源命令不存在。采用 。代替。

–梅勒
19年1月25日在21:35

该解决方案不适用于SunOS 5.9。显示以下错误:SHELL = / bin / bash crontab:前一行错误;在行中发现意外字符。 crontab:在输入中检测到错误,未生成crontab文件

–鸟人
19 Jun 19'在12:54



嗯...我已经好几年没有使用Sun了,但是也许他们的crontab版本不支持设置默认的shell。在您的情况下,我将得到一些类似于* / 1 * * * * / bin / bash $ HOME / cron_job.sh的代码。

– Robert Brisita
19年6月20日在2:21

#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 楼


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

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

评论


我同意@fpmurphy,它也可以确保安全的过程环境。如果只想从cron设置几个变量,则可以使用/ usr / bin / env命令设置变量,然后可以充当cronjob的环境进程。

– Nikhil Mulley
2011-12-21 6:24

daemontools的envdir也会浮现在脑海。

–sr_
2011-12-21 9:42

为了安全起见,我可能会创建一个〜/ .cronvars文件,并将其包含在配置文件以及cron脚本中。我不想在我运行的每个脚本中对环境变量进行硬编码,因为当路径更改时,每个文件中的硬编码路径都难以维护。似乎这样可以将所需变量集中放置在一个位置,并且仍然避免加载其他变量。

– cwd
2011-12-21 23:21

该答案被标记为“不是答案”,我倾向于同意。该问题询问“如何使用现有环境变量运行cron命令?”不是一个好主意。如果您可以修改答案以显示解决问题的方法(通过将现有的env vars合并到脚本中),则可以解决该问题。谢谢!

– Jeff Schaller♦
20年1月28日在15:37

#5 楼

这种语法绝对可以帮助您。我不了解语法,但是可以。在将Oracle Configuration Manager部署到crontab时,Oracle使用此语法,因此,我认为这是一个正确的解决方案。

0 5 * * * SOME_ENV_VAR=some_value some_command some_parameters


评论


我不喜欢这种解决方案,因为它会污染crontab,但是,是的,它有效!谢谢。

–布雷克·弗雷德里克(Blake Frederick)
20 Apr 27'0:54

#6 楼

您可以将全局环境变量放在/etc/environment中。
当crontab运行程序时,将加载它们。例如:

env | grep ORACLE_HOME >> /etc/environment
service crontab restart


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

评论


当您想将同一环境应用于数十行而不是编辑整个现有crontab时,这是一种更好的方法。

–法比恩·哈达迪(Fabien Haddadi)
20年7月9日在9:49

#7 楼



BASH_ENV=/home/user/.profile


添加到crontab中。请参阅如何保证$ BASH_ENV的可用性

#8 楼

我没有设置配置文件,而是设置了PATH。我的cron脚本中有些命令不可用,因为PATH是不同的。如果您可以使用模板并在以后取消模板化,那就更好了。

#9 楼

最近,我遇到一个案例,其中我必须以root用户身份执行整个cronjob,但同时又必须以其他用户身份执行子命令(这需要采购该用户的环境)。我采用了以下方法:

# m  h  dom  mon  dow  user  command
*/5  *   *    *    *   root  (sudo -i -u <the user> command-to-be-run-as-user) && command-to-be-run-as-root


关键部分是传递给-i的参数sudo,它将在单独的登录shell中执行给定命令( turn意味着用户的点文件将被获取。)

PS:请注意,user列仅在/etc/crontab/etc/cron.d/*文件中可用。

#10 楼



您创建了一个包装器脚本,该包装器调用. ~/.cronfile,然后执行您想要的操作。此脚本由cron启动。

~/.cronfile中,为cron作业指定环境。

#11 楼

我放 。 ~/.dbus/session-bus/*在我所需脚本的顶部:)

评论


欢迎来到U&L SE。请进一步扩展您的答案,以使读者受益。

– Ramesh
2014-09-20 15:25