我编写了各种脚本来启动 Java 服务器应用程序,这些脚本通常运行 24 小时后才关闭(通过使用不同的参数调用相同的脚本)。
该脚本依赖于文件中定义的环境变量:~/<user>.env
,我从中获取该文件.bashrc
。
从命令行调用脚本时,这可以正常工作,但如果我想将脚本添加为 crontab 条目,我就会遇到.bashrc
无法读取的问题。
我的问题:解决这个问题的最佳实践方法是什么?我意识到我可以定义一个 crontab 条目,例如:
* * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh'
...但这看起来太丑了。或者,我可以myuser.env
在每个脚本的开头都加上 source,但这会成为维护的噩梦。
任何帮助均感激不尽。
答案1
我通常使用一个简短的 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 中设置变量。不幸的是,我在工作中无法使用它们。
答案2
实际上,我发现了一个相当优雅的解决方案,即在 bash 命令中添加“-l”(--login)标志,这会导致它获取所有登录文件,包括 .bashrc。因此,我的 crontab 命令很简单:
* * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1
答案3
另一种(虽然不一定更好)的方法是将这些添加到 root 的 crontab 中,并让条目使用 su 和破折号来成为相关用户。然后环境变量将通过用户在 ~/.bashrc 中的默认 shell 环境自动引入,或类似。例如:
* * * * 1-5 su - scriptuser '/home/myuser/scripts/myscript.sh'
这将以 scriptuser 的身份运行该作业,并具有正确登录的所有环境变量。缺点是 scriptuser 本人无法设置此作业 - 执行此操作需要 root 权限。
答案4
我唯一能想到的其他事情是基于:
bash -i --rcfile 'init' -c 'script'
这可能不太有吸引力。