crontab 配好了却不跑,最后卡在环境变量上
【摘要】 crontab 里任务被触发但脚本静默退出,多半是环境变量不同。手动执行与定时执行各导一份 env 对比,再把命令改成绝对路径即可。
上周给一台跑批的云服务器加了个备份脚本,手动执行一次没报错,放进 crontab 之后日志里什么都没有。开始以为没到点,等了一天还是空的。
先怀疑权限,脚本属主、crontab 属主、备份目录权限挨个查了一遍,都对。去翻 /var/log/cron,能看到那条任务确实被触发了,只是脚本里第一行 date 就没写进日志文件,说明脚本一进去就退了。
后来在脚本开头加了一句 env > /tmp/env.log,把手动执行和 crontab 执行的环境各导一份出来对比,差别比我想的大。手动跑的时候 PATH 里有 /usr/local/bin,crontab 里只有 /usr/bin:/bin。脚本里调的工具正好装在 /usr/local/bin,找不到命令直接退出,而我又把 stderr 重定向到了 /dev/null,等于把报错信息自己扔了。
改法很土,就两条。脚本里所有外部命令写绝对路径;crontab 顶部加一行 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。改完第二天日志正常输出,备份文件也按时出现了。
这事之后我固定了两个习惯:新机器上先手动跑一次脚本、把环境变量导出来存着,再跟 crontab 里跑出来的那份对一遍;脚本的 stderr 一律先落到文件,确认稳定跑一段时间之后再决定要不要丢掉。这两个动作花不了五分钟,省掉的是对着空日志发呆的两天。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)