четверг, 11 октября 2018 г.

Как убить процесс или сервис. How to kill process or service.

Иногда возникает задача "убийства" нежелательного процесса или сервиса.
Но, прежде всего, надо прояснить различие между понятиями процесс, сервис и аппликация (программа).

Основа всего процесс - он является основой для сервисов и аппликаций и выполняет exe файл. В типичных случаях дело обстоит следующим образом:

- аппликация - это процесс с окошком или программа, с которой мы можем взаимодействовать,
- сервис - это процесс, не имеющий окна, т.е., работающий "скрытно". Кроме того признаком сервиса является его свойство выдерживать logoff.

Однако все это не строго обязательно - существуют процессы, которые не являются ни севисами, ни аппликациями, например, драйверы некоторых устройств. С другой стороны, существуют аппликации, основанные на сервисах.

Подробное объяснение займет больше места, но для наших целей этого достаточно.

Убийством можно заниматься при помощи различных "орудий": Net, Sc, Taskkill, PSKill, Wmic, PowerShell (to name some). 

Для остановки/поднятия сервиса (звучит мягче, чем убийство ?) чаще используют команды Net и Sc.
net stop spooler
net start spooler
Аналогично:
sc stop spooler
sc start spooler
Разница между net и sc нас пока не занимает.

Нужно заметить, что spooler является сервисом, основанном на процессе с именем spoolsv.exe.

Поэтому, если есть потребность убить процесс как процесс, придется использовать другое имя. 

Для чего может понадобиться убивать процесс, если достаточно опустить сервис? 

Резон для этого таков, что процесс может не захотеть опускаться или может застрять в процессе опускания.

Сначала путь для простого пользователя:

Включаем services.msc, находим сервис и определяем его реальное имя.
Затем идем в CMD, пишем sc queryex [servicename] и замечаем PID процесса.
Не выходя из CMD пишем taskkill /pid [pid_number] /f
После нажатия на Enter дело сделано. 

Вместо PID процесса можно использовать его имя, для этого достаточно использовать параметр /im: taskkill /im [process_name] /f

Кажется, что так удобнее, ведь имя процесса "человечнее" и узнать его легче, чем PID. Кроме того, имя не меняется при каждом запуске процесса, в отличие от PID и его легче заложить в Batch файл.
Проблема метода в том, что так убиваются все процессы с соответствующим именем. С другой стороны, иногда это как раз необходимо, как в случая с Chrome, который на каждое окошко открывает отдельный процесс, кушая при этом много памяти, а опустить все его инстансы (instances) по PID вручную может быть затруднительно. 

И здесь очень поможет следующая команда: 

taskkill /im chrome.exe /f
Просто приятно было наблюдать все эти десятки процессов-окошек, закрывающихся на глазах изумленного себя.:)

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

В качестве примера возьмем Spooler, ответственный за печать. Он безопасен для системы и является примером процесса-сервиса.

Если Spooler поднят, tasklist выдаст errorlevel 1, а если опущен - errorlevel 0.
Теперь попытаемся опустить Spooler при помощи net stop, а в случае неудачи применим taskkill.
::---Start
tasklist /fi "imagename eq spoolsv.exe" |find ":" > nul
if errorlevel 1 net stop "spooler"
if errorlevel 1 taskkill /f /im "spoolsv.exe"
::===END

Обратите внимание на различие в именах сервиса (spooler) и исполняемого файла (spoolsv.exe).

Обратите также внимание: не играет роли то, что проверка выполняется на сервис, а поднимаем мы процесс. Все работает. 

Для поднятия сервиса можно использовать следующий простой код:

::---Start
tasklist /fi "imagename eq spoolsv.exe" |find ":" > nul
if errorlevel 0 net start "spooler"
::===END

Если по какой-то причине вам нужно опустить и, затем, после паузы поднять сервис, воспользуйтесь известным способом, программой Ping:

::---Start
net stop spooler
ping 127.0.0.1 -n 10 -w 1000 > nul
net start spooler
::===END

Этот простой прием даст вам отсрочку в 10 секунд.


Ну, а когда закончите читать статью при помощи браузера Chrome, можете вместо Spooler использовать слово Chrome. Только поставьте значок комментария перед строчкой net stop, т.к., этот процесс является примером аппликации, не имеющей сервиса. 

Ок, я помогу...

::---Start
@echo off
taskkill /t /im chrome.exe /f
EXIT /B
::===END

Good luck!






1 комментарий:

  1. Spector Training: Как Убить Процесс Или Сервис. How To Kill Process Or Service. >>>>> Download Now

    >>>>> Download Full

    Spector Training: Как Убить Процесс Или Сервис. How To Kill Process Or Service. >>>>> Download LINK

    >>>>> Download Now

    Spector Training: Как Убить Процесс Или Сервис. How To Kill Process Or Service. >>>>> Download Full

    >>>>> Download LINK J6

    ОтветитьУдалить