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

Octopus Deploy部署.NET Core控制台应用:如何按DLL名终止旧进程

如何通过DLL名称终止.NET Core进程(适配Octopus Deploy)

这个问题我之前部署.NET Core控制台应用时也踩过坑——所有进程都叫dotnet,光靠进程名根本没法精准定位旧版本。给你几个亲测有效的方案,直接能在Octopus Deploy里用:

方案1:通过PowerShell匹配命令行参数(最推荐)

.NET Core启动时,命令行参数里会明确包含你要运行的DLL路径,我们可以利用这一点筛选进程:

# 替换为你的目标DLL名称,比如MyApp.dll
$targetDll = "MyApp.dll"

# 筛选并终止包含目标DLL的dotnet进程
Get-CimInstance Win32_Process | 
    Where-Object { $_.CommandLine -like "*$targetDll*" } | 
    ForEach-Object { Stop-Process -Id $_.ProcessId -Force }

在Octopus里的操作步骤:

  • 添加一个Run a Script步骤
  • 脚本类型选PowerShell
  • 把上面的代码粘贴进去,替换$targetDll的值即可

如果是Linux环境,用bash命令实现同样逻辑:

# 替换为你的目标DLL名称
TARGET_DLL="MyApp.dll"
pkill -f "dotnet.*$TARGET_DLL"

方案2:改成独立部署(生成专属EXE)

如果你能接受部署包体积变大,可以把.NET Core应用改成独立部署(Self-Contained Deployment):

  • 在发布时加上参数-c Release -r win-x64 --self-contained true(Windows为例)
  • 发布后会生成一个和项目同名的EXE文件(比如MyApp.exe),进程名就是这个EXE的名字
  • 之后在Octopus里直接按进程名MyApp.exe终止即可,不用再纠结DLL

这个方案的好处是操作简单,但缺点是每个部署包会包含.NET Core Runtime,体积会大很多,适合小体量应用。

方案3:通过部署目录定位进程

如果你的应用每次都部署到固定目录(Octopus默认会用版本号区分目录),可以通过进程的工作目录筛选:

# 用Octopus内置变量获取当前部署目录,不用硬编码
$deployDir = "#{Octopus.Action.Package.InstallationDirectoryPath}"

Get-Process dotnet | 
    Where-Object { $_.Path -like "$deployDir\*" } | 
    Stop-Process -Force

这个方案依赖部署目录的唯一性,适合目录结构规范的场景。

注意事项

  • 记得加-Force参数,防止进程因占用资源无法正常终止
  • 如果应用有多个实例运行,这些方案会终止所有匹配的进程,按需调整筛选条件即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:05