Скрипт для перезапуска службы windows

cmd, Скрипт перезапуска службы

Скрипт останавливает службу «service-name».
Убивает процесс «service-name.exe», если такой есть.
Запускает службу обратно в работу.
В промежутках между командами задана пауза, чтобы дать службе/процессу время на завершение.

.bat-скрипт

REM CODEPAGE Win 866 (OEM)

REM Останавливаем службу
NET stop service-name

REM Ждём
TIMEOUT /T 120 /NOBREAK

REM Проверяем наличие процесса службы (просто для информации)
TASKLIST /FI «IMAGENAME eq service-name.exe»

REM Убиваем службу. На случай, если она зависла и не останавливается
TASKKILL /F /IM service-name.exe

REM Ждём
TIMEOUT /T 120 /NOBREAK

REM Запускаем службу обратно в работу
NET start service-name

#скрипты #windows #cmd

2019-08-20 22:04:53

Задача:

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

Решение:

Приведу два примера. Они по-сути одинаковые, только проверка состояния службы Windows немного отличается.

  • Вариант 1:

    Код: Выделить всё

    @Echo Off
    Net Stop Spooler
    PING -n 1 -w 10000 192.168.253.253 > nul
    :ReStartService
    Net Start Spooler
    net start | find /i "Диспетчер очереди печати">NUL
    if %errorlevel%==1 echo GoTo ReStartService
    EXIT
  • Вариант 2:

    Код: Выделить всё

    @Echo Off
    Net Stop Spooler
    PING -n 1 -w 10000 192.168.253.253 > nul
    :ReStartService
    Net Start Spooler
    SC query Spooler | find /i "1  STOPPED" > nul
    if %errorlevel%==0 echo GoTo ReStartService
    EXIT

В обоих вариантах алгоритм такой:

  1. Завершаем службу

  2. Делаем паузу 10 секунд командой PING до несуществующего хоста

  3. Запускаем службу

  4. Выполняем проверку

  5. Если служба не запущена, возвращаемся к метке «ReStartService», иначе — завершаем работу командного файла

Различие методов — в способе проверки состояния службы. В первом методе мы просматриваем весь список запущенных служб на предмет наличия в нем псевдонима нашей службы (например, у службы «Spooler» псевдоним в русскоязычной локализации Windows будет «Диспетчер очереди печати»).

Во втором методе мы ищем в тексте, выдаваемом командой «SC query» строку «1 STOPPED», которая показывает состояние службы и в данном случае означает, что служба остановлена. Более того, строка «1 STOPPED» во всех локализациях отображается одинаково, поэтому второй метод является более универсальным.

  1. Copy and save the below script as MaintainService.ps1
  2. Open Powershell and navigate to the path where the script is saved
  3. Simply type part of the script name and then press tab for auto-complete
  4. You have to provide a service name and action (stop, start, restart) as part of the script parameters.

<#

Author: Khoa Nguyen
PS C:\Users\KoA\Dropbox\Code-Store\powershell> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      15063  608

This is a quick script to start, stop and restart a service. The script will validate that
the service exists and the required action parameter (stop, start, restart) is valid prior
to executing the script.

Sample Executions:

PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Start
Spooler is stopped, preparing to start...
Spooler - Running
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Stop
Spooler is running, preparing to stop...
Spooler - Stopped
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 FakeService Start
FakeService not found
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 FakeService Stop
FakeService not found
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Start
Spooler is stopped, preparing to start...
Spooler - Running
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Restart
Spooler is running, preparing to restart...
Spooler - Running
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Stop
Spooler is running, preparing to stop...
Spooler - Stopped
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Restart
Spooler is stopped, preparing to start...
Spooler - Running
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 Spooler Check
Action parameter is missing or invalid!
PS C:\Users\KoA\Dropbox\Code-Store\powershell> .\MaintainService.ps1 FakeService Check
FakeService not found
PS C:\Users\KoA\Dropbox\Code-Store\powershell>

#>

param (
[Parameter(Mandatory=$true)]
[string] $ServiceName,
[string] $Action
)

#Checks if ServiceName exists and provides ServiceStatus
function CheckMyService ($ServiceName)
{
	if (Get-Service $ServiceName -ErrorAction SilentlyContinue)
	{
		$ServiceStatus = (Get-Service -Name $ServiceName).Status
		Write-Host $ServiceName "-" $ServiceStatus
	}
	else
	{
		Write-Host "$ServiceName not found"
	}
}

#Checks if service exists
if (Get-Service $ServiceName -ErrorAction SilentlyContinue)
{	#Condition if user wants to stop a service
	if ($Action -eq 'Stop')
	{
		if ((Get-Service -Name $ServiceName).Status -eq 'Running')
		{
			Write-Host $ServiceName "is running, preparing to stop..."
			Get-Service -Name $ServiceName | Stop-Service -ErrorAction SilentlyContinue
			CheckMyService $ServiceName
		}
		elseif ((Get-Service -Name $ServiceName).Status -eq 'Stopped')
		{
			Write-Host $ServiceName "already stopped!"
		}
		else
		{
			Write-Host $ServiceName "-" $ServiceStatus
		}
	}

	#Condition if user wants to start a service
	elseif ($Action -eq 'Start')
	{
		if ((Get-Service -Name $ServiceName).Status -eq 'Running')
		{
			Write-Host $ServiceName "already running!"
		}
		elseif ((Get-Service -Name $ServiceName).Status -eq 'Stopped')
		{
			Write-Host $ServiceName "is stopped, preparing to start..."
			Get-Service -Name $ServiceName | Start-Service -ErrorAction SilentlyContinue
			CheckMyService $ServiceName
		}
		else
		{
			Write-Host $ServiceName "-" $ServiceStatus
		}
	}

	#Condition if user wants to restart a service
	elseif ($Action -eq 'Restart')
	{
		if ((Get-Service -Name $ServiceName).Status -eq 'Running')
		{
			Write-Host $ServiceName "is running, preparing to restart..."
			Get-Service -Name $ServiceName | Stop-Service -ErrorAction SilentlyContinue
			Get-Service -Name $ServiceName | Start-Service -ErrorAction SilentlyContinue
			CheckMyService $ServiceName
		}
		elseif ((Get-Service -Name $ServiceName).Status -eq 'Stopped')
		{
			Write-Host $ServiceName "is stopped, preparing to start..."
			Get-Service -Name $ServiceName | Start-Service -ErrorAction SilentlyContinue
			CheckMyService $ServiceName
		}
	}

	#Condition if action is anything other than stop, start, restart
	else
	{
		Write-Host "Action parameter is missing or invalid!"
	}
}

#Condition if provided ServiceName is invalid
else
{
	Write-Host "$ServiceName not found"
}

Have you ever felt the need to restart any of the windows service and its dependent services? There might be situation where you have to periodically restart the windows service due to various reasons.

One reason I have come across to restart windows service at specific period was when one of our domain controller’s lsass process kept on utilizing memory and gradually increased the memory that ultimately resulted into a hung server.

We needed to find the root cause of the issue but until then we also needed to keep the services provided by domain controller up and running. As a temporary solution, we created the script to restart active directory services and it’s dependent services which we configured to run at specific interval using task scheduler.

The script along with restarting the main service and it’s dependent services, also checks whether any of the service has went into hang state. If any of the service is found to be in hang state, it will fetch the PID of the hang service and will kill the corresponding process. It will then attempt to restart the service once again.

The same script can be used to restart any other windows service as well. You just need to provide the name of the main service. Script will automatically get the dependent services.

The name of the main service should be mentioned in place of «ntds». Below lines of code will get the service name and it’s dependent services.

#Get the ADDS and its dependent services
$set1 = @((Get-Service -Name ntds).Name)
$set2 = Get-Service -Name ntds -dependent | foreach {$_.name}
$set3 = $set1 + $set2

Below mentioned code will initiate the command to restart the services. It will store the result in apowershell job. Later you can check the status of the job. The script will then wait for 120 seconds to restart the services.

#Restart the ADDS and its dependent services
$job = start-job -scriptblock {Restart-Service -name ntds -force}

#Give time to restart the services
start-sleep -Seconds 120

Below mentioned code will check for the state of each service and if any of the service went in hung mode will restarting, it will kill the corresponding process and will reinitiate the restart of the service.

#Check status of service and if required restart the service
foreach ($service in $set3) 
    {$status=(get-service -name $service).status
 If ($status -eq "Stopping") 
            {$PI=Get-WmiObject -Class Win32_Service -Filter "Name LIKE '$service'" | Select-Object -ExpandProperty ProcessId
 taskkill.exe /PID $PI /F
 Start-Sleep -Seconds 5
            }
 Restart-Service -Name $service
     }

Complete script can be found below:

#Get the ADDS and its dependent services
$set1 = @((Get-Service -Name ntds).Name)
$set2 = Get-Service -Name ntds -dependent | foreach {$_.name}
$set3 = $set1 + $set2

#Restart the ADDS and its dependent services
$job = start-job -scriptblock {Restart-Service -name ntds -force}

#Give time to restart the services
start-sleep -Seconds 120

#Check status of service and if required restart the service
foreach ($service in $set3) 
    {$status=(get-service -name $service).status
 If ($status -eq "Stopping") 
            {$PI=Get-WmiObject -Class Win32_Service -Filter "Name LIKE '$service'" | Select-Object -ExpandProperty ProcessId
 taskkill.exe /PID $PI /F
 Start-Sleep -Seconds 5
            }
 Restart-Service -Name $service
     }

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Заглушить bluetooth колонку windows
  • For the windows in paradise
  • Как войти в безопасный режим windows 10 на ноутбуке леново
  • Windows server failover cluster настройка
  • Что делать если нагрузка на диск 100 windows 10