我们编写好了一个shell脚本之后,直接运行脚本可以执行,但是用crontab做定时任务时却无法自动执行
已经排除脚本文件的执行权限问题,通过日志也能看到定时任务有被正常执行,但是定时任务下的脚本却没有出结果,这种问题很大可能是环境变量的影响。
-
解决方法:
可以在脚本中最开始的部分加载下这些环境变量,例如脚本最开始的部分加上source /home/postgres/.bash_profile
另外脚本中的一些命令的应用最好也是写成绝对路径,例如find
可以写成/usr/bin/find
-
引申
对于在一个shell脚本中调用另一个shell脚本文件,常用的有三种方法:- fork,直接调用,即在调用时新开一个shell,老的shell依旧存在,新shell执行完之后返回老的shell,新shell继承老shell的环境变量,但是新shell中的环境变量不会带回到老shell中;
- exec,这种方法不需要再新开一个shell,被调用的shell与父脚本在同一个shell内执行,但是使用exec调用脚本之后,父脚本中exec行之后的内容就不会再执行了;
- source,也可以直接写成
.
,也是不需要新开一个shell,并且source行之后的内容依旧会再执行,这样被调用的脚本中声明的变量和环境变量都可以在主脚本中得到和使用。