如何彻底停止本地Azure Function?解决VS Code调试重启续执行问题
问题背景与核心诉求
我运行的是带有嵌套编排器结构的HTTP触发Azure Durable Function,单次执行可能持续数小时并执行数百次数据库操作。开发测试阶段在MacOS的VS Code中以调试模式本地运行,通过Ctrl+C终止进程后,重启调试器时函数会从上次中断处继续执行之前的长时间进程,无法彻底停止,终端日志可确认其在运行。
启动HTTP触发函数时会返回"statusQueryGetUri"和"terminatePostUri"用于停止实例,但我不知道如何获取当前运行的执行ID来终止活跃实例。
环境信息
launch.json配置
{ "version": "0.2.0", "configurations": [ { "name": "Attach to Python Functions", "type": "python", "request": "attach", "port": 9091, "preLaunchTask": "func: host start" } ] }
依赖版本
azure-functions==1.17.0 azure-functions-durable==1.2.6
开发环境
- VS Code版本:1.90.2
- 操作系统:Darwin arm64 23.3.0
已尝试方法
- 重启VS Code及电脑
- 查找本地存储的状态文件但未找到
- 通过
ps aux | grep python定位进程后用kill -9 ID终止
期望结果
启动调试器后函数处于空闲状态,需通过Postman触发HTTP请求才执行;终止进程后,下次启动调试器不会继续之前的执行。
解决方案
1. 获取活跃实例ID
本地Durable Functions的实例状态存储在配置的开发Blob存储(或Azure Storage模拟器)中,可通过以下方式获取实例ID:
- 调用本地API查询:发送GET请求到
http://localhost:7071/runtime/webhooks/durabletask/instances,返回的列表中包含所有实例的instanceId和运行状态。 - 查看存储容器:如果使用Azure Storage模拟器或开发存储账号,进入
azure-webjobs-hosts容器,查找durabletask前缀的Blob,Blob名称中包含实例ID,或打开Blob内容查看完整实例信息。
2. 终止指定实例
拿到instanceId后,构造终止请求:
- 发送POST请求到
http://localhost:7071/runtime/webhooks/durabletask/instances/{instanceId}/terminate - 请求体可传入终止原因,示例:
{"reason": "测试手动终止"}
3. 彻底清除本地状态(避免自动恢复)
直接清除Durable Functions的状态存储,从根源解决重启恢复问题:
- Azure Storage模拟器:打开模拟器管理页面(默认
http://127.0.0.1:10000/devstoreaccount1),删除azure-webjobs-hosts容器下所有durabletask相关Blob;或直接重置模拟器数据。 - 开发Blob存储账号:登录Azure门户,找到对应存储账户的
azure-webjobs-hosts容器,删除所有durabletask前缀的Blob。
4. 修改配置禁用自动恢复
在local.settings.json中添加以下配置,禁止实例自动恢复,适合开发测试场景:
{ "Values": { "AzureWebJobsStorage": "你的存储连接字符串", "FUNCTIONS_WORKER_RUNTIME": "python", "DurableTasks_DisableInstanceReplay": "true", "DurableTasks_HistoryDeleteOnCompletion": "true" } }
DurableTasks_DisableInstanceReplay:禁用未完成实例的自动恢复DurableTasks_HistoryDeleteOnCompletion:实例完成后自动删除历史记录,减少存储冗余
5. 彻底终止所有相关进程
之前的进程终止可能遗漏了函数宿主进程,需同时清理func和Python进程:
# 查找所有相关进程 ps aux | grep -E "(func|python)" # 终止进程,替换为实际PID kill -9 <进程PID>
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

