crontab 中的任务命令行正常,但是不被调度不执行的原因

问题描述

同事在docker里部署了一个nginx,然后用certbot获取的证书。

但是certbot在docker里自动刷新证书有效期(renew)的操作没执行。

咱也不是很熟docker里的nginx如何配置certbot自动刷新,偷个懒,在外面执行docker exec 调用就算了----原本是这么计划的

结果写了个脚本,调试完成,测试成功,就差一步了:把它放crontab任务里,每周日0:00执行一下,它就是不被调度。

定位过程

首先咱是在网上搜索有没有前辈碰到这个问题,挨个检查了权限,环境变量这些,确定咱的脚本没问题。 然后就卡住了。

自己想办法把,从头开始。

在crontab里搞个任务

javascript 复制代码
*/1 * * * * /bin/echo `date` >> /root/1.log

最直接了,root用户直接上,只执行个echo。

结果不得行,它也不被调度 🥹

使用crontab -l查看任务的时候发现它是这个样子的

ruby 复制代码
root@0003:~# crontab -l 
root@0003:~# bin/echo `date` >> /root/1.log of crontab(5) and cron(8)

???嗯?

直接 vi /var/spool/cron/crontabs/root 一看, 好家伙,一堆^M在里面,解析不出来任务啊!

原因找到,原来是文件格式不对。

解决方式

简单的把任务内容备份下来,然后把原始文件内容全删了,重新用crontab -e粘贴进去 保存退出后crontab -l一看,正常了! 继续监视那个1.log ,也正常了。 删了1.log的那个任务,刷新任务也测试了,正常调度。

ok, 收工了。

总结

cron任务脚本正常,但是不调度的原因又多了一条:crontab 文件格式不正确。

现在发现crontab中的任务不执行的检查清单是:

  1. 先命令行检查脚本可以正确执行
  2. 再用service cron status确认服务是启动的
  3. 再用crontab -l来检查任务是可以被正确解析的 本文就是这里发现没有正确的显示所有的任务,才想起来去查看文件格式的
  4. 全部正确,再检查任务描述里的时间这些写对没
  5. 检查环境变量:在脚本里打印使用到的变量和命令的路径

补充

后来进docker看了一下,docker里默认没有cron服务,而certbot是用它来做自动更新的,所以docker里的certbot不会定时自动更新

相关推荐
Java爱好狂.5 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
马良神笔7 小时前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD7 小时前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
高频因子挖掘机8 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机8 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
团子哒哒9 小时前
数组、切片和Map
后端
专注仿真10 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷10 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m5555555510 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊10 小时前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端