Shell 脚本手动跑没问题,放进 crontab 就报 command not found
【摘要】 前几天写了个小脚本,每天凌晨把一个目录打包备份。自己在终端里执行 ./backup.sh,一切正常,压缩包也生成了。于是放心地加进了 crontab,设成每天 2 点跑。第二天早上一看,备份目录里什么都没有。先去看了下有没有执行。我在 crontab 那行后面加了 >> /tmp/backup.log 2>&1,把输出存下来,第二天再看日志,里面有一句很显眼的报错:tar: command ...
前几天写了个小脚本,每天凌晨把一个目录打包备份。自己在终端里执行 ./backup.sh,一切正常,压缩包也生成了。于是放心地加进了 crontab,设成每天 2 点跑。
第二天早上一看,备份目录里什么都没有。
先去看了下有没有执行。我在 crontab 那行后面加了 >> /tmp/backup.log 2>&1,把输出存下来,第二天再看日志,里面有一句很显眼的报错:tar: command not found。
这就奇怪了,tar 明明能用。查了一下才知道,cron 跑任务时的环境和我登录后的终端不一样,它的 PATH 很短,通常只有 /usr/bin:/bin 这几个目录。我脚本里用到的另一个工具装在 /usr/local/bin 下面,cron 根本找不到。报错里写的是 tar,其实是我用的打包命令被我包了一层 alias,cron 里也不认 alias。
解决方法其实挺简单,有两种:
- 在脚本开头手动写上 PATH,比如 export PATH=/usr/local/bin:/usr/bin:/bin。
- 脚本里的命令都写绝对路径,可以先用 which tar 查一下具体在哪。
我用的是第一种,顺便把 alias 换成了真正的命令。改完以后,为了不用等到第二天,我把 crontab 临时改成每分钟跑一次,看日志确认成功了,再改回凌晨 2 点。
这次踩坑之后记住了两件事:一是 cron 任务一定要把输出重定向到日志,不然出问题完全没头绪;二是手动能跑不代表 cron 能跑,环境变量要自己写清楚。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)