Linux Crontab定时执行脚本出错,但手动执行脚本正常原因及解决方案
实际开发场景
需要开发一个Flink监控程序,初步使用shell脚本进行监控,如果发现失败了,则自动重新运行Flink命令行参数进行重启。
遇到的问题
编写好shell脚本后,在linux命令行调用 sh shell.sh进行测试,成功实现监控和重启功能。于是利用crontab对脚本进行定时调度监控。
后来发现,当Flink失败时确实发出了监控报警,但是却没有自动重启。经排查后发现,应该是脚本中Flink命令行启动Flink任务没有成功,但是在Linux控制台中测试又没问题,这是什么原因呢?
查找资料之后发现,crontab有一个坏毛病,就是它总是不会缺省的从用户profile文件中读取环境变量参数,经常导致在手工执行某个 脚本时是成功的,但是到crontab中试图让它定期执行时就是会出错。
错误原因
所以原因就在于,crontab没有去读环境变量,需要再脚本中手动引入环境变量
恍然大悟,于是尝试在脚本中加入了引入环境变量的配置:
#!bin/bash
source /etc/profile
source ~/.bash_profile
...
再执行时,问题解决。
原来就是因为crontab在执行脚本时没有读取环境变量,导致执行Flink命令行出错
在Linux环境中,使用Crontab执行shell脚本时,由于Crontab不自动加载环境变量,可能会导致脚本执行失败。问题在于脚本中启动Flink的命令行依赖于某些环境变量,而这些变量在Crontab环境下未被设置。解决方法是在脚本开头引入环境变量,如`source /etc/profile`和`source ~/.bash_profile`,确保脚本在无交互环境下也能正确获取环境变量。通过这种方法,可以确保Crontab定时任务能正常执行shell脚本中的Flink重启操作。

2023

被折叠的 条评论
为什么被折叠?



