【问题标题】:Force closing a running dotnet process强制关闭正在运行的 dotnet 进程
【发布时间】:2019-05-19 11:01:07
【问题描述】:

我们正在尝试制定一个 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 作业)。

【问题讨论】:

  • 这是你的程序吗?如果是这样,那么不要使用taskkill,您不应该建立一种合作方式要求它优雅地终止吗?

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


【解决方案1】:

我找到了一种利用 taskkill 工具来定位特定 dotnet 应用程序的方法,尽管使用情况可能会因场景而异。

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

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


显然,如果我们的程序集没有以独特的方式命名,这将无法正常工作,例如,如果我们将控制台应用程序命名为 App.dll

【讨论】:

    【解决方案2】:

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

    因此,经过大量阅读后,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2017-05-02
      • 2014-08-02
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2017-03-05
      相关资源
      最近更新 更多