强制关闭正在运行的dotnet进程

时间:2018-12-19 00:27:00

标签: windows .net-core windows-server dotnet-cli

我们正在尝试制定CI / CD管道策略,该策略涉及强制关闭/杀死在VisualCron服务器上运行的正在运行的dotnet进程:

  1. 关闭VC作业
  2. 强制关闭/终止该过程(????)
  3. 部署最新程序集
  4. 重新启动VC作业

我们遇到的问题是该VC服务器正在运行大量作业。过去这不是问题,因为.NET Framework应用程序被适当地命名为“ somejob.exe”。但是,对于dotnet,每个进程都以dotnet.exe的身份运行。

是否有一种方法可以基于传递给dotnet.exe的入口点程序集来关闭/杀死正在运行的dotnet.exe进程的特定实例?例如,dotnet c:\jobs\somejob.dll –我们只需要关闭/杀死该作业(而不是正在运行的其他dotnet作业)。

2 个答案:

答案 0 :(得分:0)

这不是一个很好的解决方案,但应该可以解决问题。

因此,在进行大量阅读之后,似乎这个问题是dotnet核心团队知道的,但并不是优先考虑的事情(如果他们已解决的话)。

现在,我尝试执行此操作,而没有强迫您安装计算机的任何新内容,而仅依靠 cmd命令

第1步。

使用START开始该过程

> START "" cmd.exe /C dotnet <mydll> <MyUniqueIdentifier>

例如。

> START "" cmd.exe /C dotnet HelloWorld.dll HelloWorldProgram

第2步。

下面的代码可以在批处理脚本中运行,以找到所述程序的进程ID

@echo off
set DLL_NAME=HelloWorld.dll
set UNIQUE_ID=HelloWorldProgram
FOR /f "delims=" %%a IN ('wmic process WHERE COMMANDLINE^="dotnet  %DLL_NAME% %UNIQUE_ID%" list full ^| findstr /I "^ProcessId"') DO (
    SET P=%%a
)
REM Here we have the Process ID
SET DNETP=%P:~10%

REM Terminate the proces
taskkill /PID %DNETP% /F

答案 1 :(得分:0)

我发现了一种利用taskkill工具定位特定dotnet应用程序的方法,尽管用法可能会因情况而异。

在我们的场景中,我们的程序集以非常独特的方式命名...我们所有的应用程序都很好地命名为CompanyName.ProductName.ConsoleAppName.dll。这使我们可以使用filter命令并基于特定模块进行过滤:

taskkill /FI "Modules eq CompanyName.ProductName.ConsoleAppName.dll"


很明显,如果我们的程序集不是以唯一的方式命名的,那么,例如,如果我们有一个名为 App.dll 的控制台应用程序,这将无法正常工作。