使用Azure DevOps Pipeline部署.Net服务是否会遇到进程占用无法替换文件问题
Azure DevOps Pipeline发布.NET服务进程占用问题说明
- 改用Azure DevOps Pipeline自动化发布仍然会遇到进程占用导致的文件替换失败问题
- 该问题根源于操作系统的文件锁定机制:运行中的.NET进程会持续锁定自身加载的dll、exe等可执行文件,禁止其他进程修改、删除这类文件,和发布所用的工具没有关系,无论手动发布还是CI/CD自动发布都会触发该限制。
Pipeline规避方案
你只需要在发布阶段按顺序增加启停服务的步骤即可完全解决该问题,标准流程如下:
- 前置步骤:停止目标服务器上运行的.NET服务
- Windows服务场景:执行
Stop-Service -Name 你的服务名PowerShell命令,或sc stop 你的服务名cmd命令 - Linux systemd托管场景:执行
systemctl stop 你的服务名shell命令 - IIS托管场景:执行
Stop-WebAppPool -Name 你的应用池名PowerShell命令停止对应应用池 - 可额外增加1~2秒的等待步骤,确认进程完全退出、文件锁释放后再执行下一步,避免偶发失败
- Windows服务场景:执行
- 执行二进制文件部署:通过Azure DevOps内置的拷贝任务或者部署任务完成新dll、exe文件的替换,不会再触发文件锁定报错
- 后置步骤:重启.NET服务
- 对应停止步骤执行反向启动命令即可,比如
Start-Service -Name 你的服务名、systemctl start 你的服务名等
- 对应停止步骤执行反向启动命令即可,比如
零停机进阶方案
如果需要避免发布期间服务中断,可以采用蓝绿部署逻辑:
- 服务器上部署两个相同的服务实例,部署前先把流量切到备用实例,更新主实例后再把流量切回主实例,全程无需停止对外服务
内容的提问来源于stack exchange,提问作者DevWhoDat
相关产品推荐
相关产品推荐

