Принудительное закрытие запущенного процесса dotnet - PullRequest
0 голосов
/ 19 декабря 2018

Мы пытаемся создать стратегию конвейера CI / CD, которая включает принудительное закрытие / уничтожение запущенного процесса dotnet, который выполняется на нашем сервере VisualCron:

  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 голосов
/ 21 декабря 2018

Я нашел способ использовать инструмент taskkill для нацеливания на определенное приложение dotnet, хотя использование может варьироваться в зависимости от сценария.

В нашем сценарии наши сборкиназван очень уникально ... Все наши приложения очень хорошо распределены по именам CompanyName.ProductName.ConsoleAppName.dll.Это позволяет нам использовать команду фильтра и фильтр на основе определенного модуля:

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


Очевидно, если бы наши сборки не были названы уникальным образом, это ненапример, если бы у нас было консольное приложение с именем App.dll .

0 голосов
/ 21 декабря 2018

Это не очень хорошее решение, но оно должно сработать.

Так что после большого прочтения кажется, что эта проблема известна основной команде dotnet, но не является приоритетом (если они когда-нибудь это исправят).

Теперь я попытался сделать это, не заставляя вас устанавливать что-то новое на ваш компьютер, но полагаться только на команды cmd

Шаг 1.

Запустите процесс, используя START

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

Пример.

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

Шаг 2.

Приведенный ниже код можно запустить в пакетном скриптенайти идентификатор процесса указанной программы

@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
...