crontab执行Shell脚本时的工作目录

crontab执行Shell脚本时的工作目录


由于工作需要,创建了一个crontab定时任务,用来在每天固定时间执行一个Shell脚本,在Shell脚本中,有对该脚本所在目录的相关文件进行操作的逻辑,在一开始实现时,对当前目录的文件操作时都是使用的相对目录,即./*。在终端直接sh执行时没有任何问题,正常结束,而一旦在crontab中定时执行时,就出现问题,如提示file not found等错误。

解决工作目录问题


出现问题后,我在脚本中试着打印出crontab执行时的当前目录,如curPath=$(pwd),执行后发现,打印出的结果为$HOME的目录,而非脚本所在的原始目录,这就造成了在脚本中使用相对路径时出现找不到的情况。

找到问题后,解决方法有两个:

  1. 将相对路径替换为绝对路径。(ps:如脚本中包含某些Shell命令,且命令的某些参数为默认当前目录的,都需要显式的给出绝对路径)
  2. 在操作相对路径之前,使用cd /....../,在执行脚本时强制进入到该目录。

附录


系统在执行定时任务时,是不会加载任何环境变量的,所以当脚本需要Java或其他环境变量时,可以通过在脚本中添加source /etc/profile命令来使配置生效。