强制关闭 运行 dotnet 进程
Force closing a running dotnet process
我们正在尝试制定一个 CI/CD 管道策略,其中涉及强制 closing/killing 一个 运行 dotnet 进程,它在我们的 VisualCron 服务器上 运行:
- 关闭 VC 作业
- 强制close/kill进程(?????)
- 部署最新的程序集
- 重新启动 VC 作业
我们被卡住的部分是这个 VC 服务器是 运行 无数的工作。在过去,这不是问题,因为 .NET Framework 应用程序的命名是适当的 'somejob.exe'。但是,对于 dotnet,每个进程都是 运行 as dotnet.exe.
有没有办法根据传入 dotnet.exe 的入口点程序集将 运行 dotnet.exe 进程的特定实例定位到 close/kill?例如,dotnet c:\jobs\somejob.dll
——我们只需要 close/kill 这个作业(而不是其他 dotnet 作业 运行)。
这不是一个很好的解决方案,但它应该可以解决问题。
所以在进行了大量阅读之后,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
我找到了一种利用 taskkill
工具来针对特定 dotnet 应用程序的方法,尽管使用情况可能会因场景而异。
在我们的场景中,我们的程序集以一种非常独特的方式命名......我们所有的应用程序都很好地命名空间 CompanyName.ProductName.ConsoleAppName.dll
。这允许我们使用过滤器命令并基于特定模块进行过滤:
taskkill /FI "Modules eq CompanyName.ProductName.ConsoleAppName.dll"
显然,如果我们的程序集没有以独特的方式命名,这将无法正常工作,例如,如果我们的控制台应用程序名为 App.dll。
我们正在尝试制定一个 CI/CD 管道策略,其中涉及强制 closing/killing 一个 运行 dotnet 进程,它在我们的 VisualCron 服务器上 运行:
- 关闭 VC 作业
- 强制close/kill进程(?????)
- 部署最新的程序集
- 重新启动 VC 作业
我们被卡住的部分是这个 VC 服务器是 运行 无数的工作。在过去,这不是问题,因为 .NET Framework 应用程序的命名是适当的 'somejob.exe'。但是,对于 dotnet,每个进程都是 运行 as dotnet.exe.
有没有办法根据传入 dotnet.exe 的入口点程序集将 运行 dotnet.exe 进程的特定实例定位到 close/kill?例如,dotnet c:\jobs\somejob.dll
——我们只需要 close/kill 这个作业(而不是其他 dotnet 作业 运行)。
这不是一个很好的解决方案,但它应该可以解决问题。
所以在进行了大量阅读之后,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
我找到了一种利用 taskkill
工具来针对特定 dotnet 应用程序的方法,尽管使用情况可能会因场景而异。
在我们的场景中,我们的程序集以一种非常独特的方式命名......我们所有的应用程序都很好地命名空间 CompanyName.ProductName.ConsoleAppName.dll
。这允许我们使用过滤器命令并基于特定模块进行过滤:
taskkill /FI "Modules eq CompanyName.ProductName.ConsoleAppName.dll"
显然,如果我们的程序集没有以独特的方式命名,这将无法正常工作,例如,如果我们的控制台应用程序名为 App.dll。