crontab 配好了却不跑,最后卡在环境变量上

举报
yd_298384123 发表于 2026/11/02 08:08:38 2026/11/02
【摘要】 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。