Windows Powershell - При выпуске программного обеспечения - Как остановить неуничтожаемые процессы перед развертыванием программного обеспечения без перезапуска

У меня есть ряд проблем, которые не уникальны сами по себе, но в целом уникальны. У меня есть серия вспомогательных консольных приложений (C #), которые выполняют различные действия, такие как подключение и изменение баз данных SSAS, доступ к внешним API и т. Д. Они периодически вызываются из задания агента SQL.

Время от времени и по какой-то совершенно неизвестной причине одно из этих консольных приложений перестает отвечать, это может привести к блокировке агента SQL, или он может продолжать работать, но вы не сможете перезапустить службу, это как бы отказывается от процесса, так что процесс запущен, но ничего не делает, он не потребляет циклы процессора и не использует какой-либо значительный объем памяти, но он неубиваемый, то есть вы не можете остановить его из диспетчера задач или любого другого другой путь. Выглядит примерно так:

введите описание изображения здесь

Они могут складываться, иногда у вас будет несколько процессов, не отвечающих на запросы, в одном ящике. Единственный способ разобраться в этом беспорядке - перезагрузить сервер. Я пробовал , поэтому множество способов убить процесс (ы), безуспешно.

Это вызывает серьезные проблемы для моего процесса автоматического выпуска, периодически мои консольные приложения обновляются, когда это происходит и эта проблема присутствует, вы получаете что-то вроде следующего, когда вы пытаетесь скопировать в папку приложения с флагом перезаписи, установленным на true ( Robocopy в этом случае, но вы можете себе представить, что это будет проблемой и для любого другого инструмента):

2020-10-23T18: 24: 36.9534370Z 2020/10/23 13:24:36 ОШИБКА 32 (0x00000020) Копирование файла XXX \ Autofac.dll 2020-10-23T18: 24: 36.9535263Z Процесс не может получить доступ к файлу, потому что он используется другим процессом.

Опять же, чтобы решить эту проблему, вам нужно взять совет @FakeName здесь, перезагрузить сервер (вручную) и перезапустить выпуск, большая боль. Я хотел бы найти способ программно с помощью Powershell убить неубиваемый процесс без перезагрузки компьютера.

Когда вы начнете искать способы сделать это, вы вскоре обнаружите, что по этому поводу есть несколько противоречивых утверждений. Сначала Рэймон Чен из Microsoft заявляет:

Таким образом, пользователи могут убить любой процесс, который они хотят (при наличии достаточных привилегий), они могут остановить любую программу от кражи фокуса и они могут удалить любой файл, который они хотят (опять же, при наличии достаточных привилегий).

@ralphtheninja указывает нечто подобное для этого тесно связанного вопрос. Однако, если вы копнете глубже, вы увидите, что существует множество, хотя и официально не поддерживаемых, или 100% надежных способов для создания неубиваемый процесс. Самая популярная и наиболее часто упоминаемая причина неуничтожаемого процесса - это проблема ошибочный код драйвера. Поскольку я не использую какие-либо известные мне драйверы, и вижу эту проблему на разных серверах и в разных версиях Windows, а также вижу эту проблему в нескольких консольных приложениях, выполняющих разные действия, я считаю, что ни один из этих методы или объяснения имеют какое-либо отношение к моей проблеме.

Если я сделаю шаг назад и посмотрю на всю концепцию процесса в Windows, мне кажется, что этот тип проблемы гораздо больше связан с отсутствием четкого направления и согласованных заявлений от Microsoft и других сторон, связанных с администрирование процессов, резюмируя:

  1. Неясно, следует ли разрешить администратору с полным доступом убивать все (и я действительно имею в виду это слово буквально, а не метафору) процессы с помощью PowerShell (или любого другого метода, такого как диспетчер задач).

  2. Неясно, с помощью какой команды / метода задача должна / может быть завершена в PowerShell или в пользовательском интерфейсе (наглядно продемонстрировано распространение сторонние инструменты в пользовательском интерфейсе и различными способами через CMD или powershell), явно предпочтительнее Stop-Process, Stop-Process явно не убивает все процессы.

  3. Непонятно, по каким причинам задача должна / не может быть завершена, как устранить эти причины, а также для тех из нас, кто не разрабатывает драйверы оконных устройств (кроме общих заявлений, таких как перезагрузите систему), как диагностировать и определить основную причину того, почему приложения, которые мы разрабатываем, могут стать неквалифицированными в Windows .

Мне еще предстоит найти (после серьезных исследований):

  • Единственная причина или список причин, по которым процесс станет неубиваемым.

  • Подробное руководство любого рода по диагностике проблем такого рода (на C # или любом другом языке, за исключением руководств, относящихся к разработке драйверов).

  • Руководство по пониманию различных способов уничтожения процесса, объясняющее не только то, как, но и почему сообщество (стек и другие) имеет так много разных способов сделать одно и то же, и, самое главное, почему каждый из способов будет работать или не работать в определенном процессе.

Перезагрузка сервера (или какой-либо другой обходной путь, не связанный с процессами) перед выпуском каждого программного обеспечения - единственное решение этой проблемы?


person David Rogers    schedule 26.10.2020    source источник