我编写了各种脚本来启动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