You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将ASP.NET Core网站自动部署到Plesk:部署后脚本中断问题

ASP.NET Core 部署至 Plesk Obsidian 脚本执行异常问题分析与解决

核心问题根源

你的问题本质是两个层面的冲突:

  1. 文件锁释放时机不对:app_offline.htm 创建后,ASP.NET Core 进程需要短暂时间回收资源、释放文件锁,直接执行复制操作会触发锁冲突,导致复制进程卡住,后续命令无法推进。
  2. Windows 命令行工具的非交互陷阱:XCOPY、ROBOCOPY 这类工具的默认行为在非交互式的 Plesk 脚本环境中会触发阻塞——比如 XCOPY 遇到已存在文件会等待用户确认,ROBOCOPY 的非0退出码会被 Plesk 判定为脚本失败,直接终止后续执行。

分步解决方法

1. 给进程足够时间释放锁

别用 TIMEOUT(部分 Plesk 环境可能未预装该命令),改用 ping 实现兼容性更强的延迟:

:: 创建维护页触发进程回收
echo Site under maintenance > app_offline.htm
:: 等待6秒(ping 6次,每次间隔1秒)
ping 127.0.0.1 -n 6 > nul

2. 用 ROBOCOPY 替代其他复制工具并处理退出码

ROBOCOPY 是 Windows 最稳定的批量复制工具,添加参数确保非交互执行,同时强制忽略正常范围内的退出码:

:: 镜像同步publish目录到根目录,覆盖现有文件,无冗余输出
robocopy "%plesk_vhosts%\你的域名\httpdocs\publish" "%plesk_vhosts%\你的域名\httpdocs" /MIR /NFL /NDL /NJH /NJS /R:3 /W:2
:: ROBOCOPY退出码0-7均为正常完成,强制返回0让Plesk继续执行后续命令
if %ERRORLEVEL% LEQ 7 set ERRORLEVEL=0

参数说明:

  • /MIR:同步目录结构,自动删除目标目录多余文件
  • /NFL/NDL/NJH/NJS:关闭各类日志输出,提升执行速度
  • /R:3/W:2:文件复制失败时重试3次,每次间隔2秒

3. 固定路径避免相对路径陷阱

全程使用绝对路径或 Plesk 内置环境变量,避免脚本执行时的路径解析错误:

set WEB_ROOT=%plesk_vhosts%\你的域名\httpdocs
echo Site under maintenance > "%WEB_ROOT%\app_offline.htm"
ping 127.0.0.1 -n 6 > nul
robocopy "%WEB_ROOT%\publish" "%WEB_ROOT%" /MIR /NFL /NDL /NJH /NJS /R:3 /W:2
if %ERRORLEVEL% LEQ 7 set ERRORLEVEL=0
del "%WEB_ROOT%\app_offline.htm"
rmdir /s /q "%WEB_ROOT%\publish"

4. 强制清理与收尾

删除 app_offline.htm 和 publish 目录时,使用强制参数避免阻塞:

:: 强制删除维护页
del /f /q "%WEB_ROOT%\app_offline.htm"
:: 强制删除非空的publish目录
rmdir /s /q "%WEB_ROOT%\publish"

5. 排查脚本日志

Plesk Git 扩展的执行日志路径为 %plesk_vhosts%\你的域名\logs\gitdeploy.log,查看日志中的错误信息,可快速定位权限不足、路径不存在等隐性问题。

额外优化方案

如果文件锁问题仍存在,可在脚本开头直接控制应用池状态(需 Plesk 管理员权限):

:: 停止应用池
plesk bin site --update 你的域名 -apppool stopped
:: 执行复制逻辑...
:: 重启应用池
plesk bin site --update 你的域名 -apppool started

内容的提问来源于stack exchange,提问作者Pieterjan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:21:26