我们正在尝试制定CI / CD管道策略,该策略涉及强制关闭/杀死在VisualCron服务器上运行的正在运行的dotnet进程:
我们遇到的问题是该VC服务器正在运行大量作业。过去这不是问题,因为.NET Framework应用程序被适当地命名为“ somejob.exe”。但是,对于dotnet,每个进程都以dotnet.exe的身份运行。
是否有一种方法可以基于传递给dotnet.exe的入口点程序集来关闭/杀死正在运行的dotnet.exe进程的特定实例?例如,dotnet c:\jobs\somejob.dll
–我们只需要关闭/杀死该作业(而不是正在运行的其他dotnet作业)。
答案 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 的控制台应用程序,这将无法正常工作。