Windows环境使用whenever gem配置定时任务不生效、无crontab文件如何解决
核心原因
whenever gem 是基于 Unix/Linux 系统原生的 crontab 定时调度组件做的封装,你使用的 Windows 系统没有内置 crontab 服务,因此会出现查询 crontab 提示文件不存在、定时调度不生效的问题。你的 rake 任务、schedule.rb 配置都是正常的,手动执行 rake 命令成功就说明业务逻辑没有问题。
针对你的两个问题的明确答复
- 不需要自行创建 crontab 文件:Windows 原生不识别 crontab 规则,也没有对应的守护进程解析执行 crontab 内容,手动创建文件也不会生效
- 无需必须部署到服务器:原生 Windows 环境无法直接运行 whenever 配置的定时任务,但可以通过替代方案在本地实现定时运行效果
可行解决方案
方案1:本地使用类Unix模拟环境
- 开启 Windows 内置的 WSL(Linux子系统),安装任意Linux发行版,在WSL环境内部署Rails项目,执行
whenever --update-crontab命令将schedule.rb的规则写入系统crontab,再启动crontab服务即可正常运行定时任务 - 也可以使用Docker容器运行项目,选择Linux基础镜像即可正常使用whenever的全部能力
方案2:使用Windows原生任务计划程序替代
如果不想使用模拟环境,可以放弃whenever gem,直接用Windows自带的任务计划程序配置定时任务:
- 打开任务计划程序,新建定时任务,触发器设置为每2分钟触发一次
- 操作项设置为「启动程序」,程序路径选择本地ruby.exe的完整路径,参数填写
bundle exec rake daily_email_call,工作目录设置为你的Rails项目根目录即可
方案3:部署到Linux服务器
生产环境通常使用Linux服务器部署,将项目部署到服务器后,执行whenever --update-crontab将定时规则写入系统crontab,启动crond服务即可正常运行定时任务。
额外注意
哪怕是在Linux环境下使用whenever,写完schedule.rb配置后必须执行whenever --update-crontab命令把配置写入系统crontab才会生效,不会自动加载schedule.rb的内容。
内容的提问来源于stack exchange,提问作者sephiroth
相关产品推荐
相关产品推荐

