crontab环境

我编写了各种脚本来启动Java服务器应用程序,这些应用程序通常在closures之前运行24小时(通过调用具有不同参数的相同脚本)。

该脚本依赖于文件中定义的环境variables: ~/<user>.env ,它来自.bashrc

从命令行调用脚本时,这工作正常,但如果我想添加脚本作为crontab条目我遇到的问题,其中.bashrc不读。

我的问题:解决这个问题的最佳做法是什么? 我意识到我可以定义一个crontab条目,如:

 * * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh' 

…但这似乎很难看。 或者,我可以在每个脚本的开始处myuser.env ,但这将成为维护的噩梦。

任何帮助赞赏。

我通常用一个简短的cron包装脚本解决这个问题:

 #!/bin/bash [ -r $HOME/.bashrc ] && . $HOME/.bashrc [ -r $HOME/.profile ] && . $HOME/.profile exec "$@" 

然后,只需在你的包装器中用crontab前缀命令即可:

 * * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh * * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myotherscript.sh 

一些版本的cron允许你直接在crontab中设置variables。 不幸的是,我不能在工作中使用这些工具。

我实际上发现了一个相当优雅的解决scheme,通过向我的bash命令添加'-l'(–login)标志,这会使它获得所有login文件,包括.bashrc。 因此我的crontab命令很简单:

 * * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1 

一个替代(尽pipe不一定更好)的select是将这些添加到根的crontab中,并使条目使用破折号成为有问题的用户。 然后,环境variables将通过〜/ .bashrc等用户的默认shell环境自动引入。 例如:

* * * * 1-5 su - scriptuser '/home/myuser/scripts/myscript.sh'这将以脚本用户身份运行该作业,并具有正确login的所有环境variables。 缺点是脚本用户本身不能设置这个工作 – 这将需要root权限来做到这一点。

cron-wrapper解决scheme为我工作了一个修改,我需要用用户主文件夹的绝对pathreplace$ HOME,在这种情况下,它是:

 #!/bin/bash [ -r /root/.bashrc ] && . /root/.bashrc [ -r /root/.profile ] && . /root/.profile exec "$@" 

我能想到的唯一的其他事情将基于:

 bash -i --rcfile 'init' -c 'script' 

这可能不太吸引人。

cron的最新版本允许您在运行作业之前设置任意的环境variables。 所以你可以添加到你的crontab:

CRON = 1

然后在你的.bash_login中做这样的事情:

[-n“$ CRON”] &&。 的.bashrc