本地部署Kudu的连续运行Webjob每15分钟自动停止如何解决?
本地部署Kudu队列触发器WebJobs 15分钟自动停止排查方案
1 修正WebJobs本身的运行配置
- 首先确认你部署的是连续运行类型的WebJobs:队列触发器的WebJobs需要配置为连续运行才会常驻后台,否则单次任务执行完成后就会自动退出。在WebJobs的部署根目录下新增
settings.job文件,写入以下配置:
部署完成后在Kudu的WebJobs管理页确认运行状态标记为「连续运行」。{ "is_singleton": true, "is_always_running": true } - 显式关闭WebJobs SDK的闲置自动退出逻辑:WebJobs SDK默认如果长时间没有队列消息处理,会自动停止宿主进程。在JobHost初始化代码中添加以下配置:
var hostConfig = new JobHostConfiguration(); // 禁止闲置超时退出 hostConfig.IdleTimeout = Timeout.InfiniteTimeSpan; // 可根据需求调整队列最大轮询间隔 hostConfig.Queues.MaxPollingInterval = TimeSpan.FromMinutes(2); new JobHost(hostConfig).RunAndBlock();
2 排查IIS进程回收规则(核心排查项)
你之前配置的Azure专属Always On配置项本地IIS不识别,需要按IIS的规则配置:
- 打开IIS管理器,定位到承载Kudu服务的应用程序池,打开「高级设置」:
- 确认「启动模式」已设置为
AlwaysRunning - 找到「回收」分类:
- 将「定期时间间隔(分钟)」设置为
0,禁用固定周期回收 - 清空「特定时间回收」列表,取消固定时间点回收
- 将「虚拟内存限制」「专用内存限制」均设置为
0,取消内存阈值回收
- 将「定期时间间隔(分钟)」设置为
- 找到「进程模型」分类:
- 将「闲置超时(分钟)」设置为
0,禁用闲置超时回收 - 将「闲置超时操作」设置为
NoAction,避免闲置后自动终止进程
- 将「闲置超时(分钟)」设置为
- 确认「启动模式」已设置为
- 在Kudu站点的
web.config中添加IIS应用程序初始化配置,保证站点被回收后自动预热启动:<system.webServer> <applicationInitialization doAppInitAfterRestart="true"> <add initializationPage="/" /> <add initializationPage="/api/webjobs" /> </applicationInitialization> </system.webServer>
3 验证保活脚本有效性
- 确认保活脚本请求的是Kudu的动态接口(推荐
/api/webjobs),不要请求静态资源,无逻辑的静态资源访问不会被IIS计数为有效活跃请求 - 如果Kudu开启了基础认证,保活请求必须携带有效的认证信息,401/403类的无权限请求无法实现保活效果
- 检查脚本执行日志,确认没有请求超时、网络不通等异常,保证保活请求实际发送成功
4 日志定位根因
打开Kudu WebJobs管理页对应的任务日志,查看停止前的最后日志内容:
- 如果日志包含「进程收到回收信号」「应用程序域卸载」类内容,说明是IIS侧的回收规则未配置正确,回到第2步重新排查
- 如果日志包含异常堆栈信息,说明是WebJobs代码本身抛出异常导致退出,对应排查代码问题(比如队列连接中断、依赖项缺失、未处理异常等)即可
内容的提问来源于stack exchange,提问作者Zoukmar
相关产品推荐
相关产品推荐

