简体   繁体   English

在远程服务器上按顺序停止和启动服务

[英]Stop and start service in-order on a remote server

I want to write a script to check 4 service on a server if they have status running when we stop them by order and start them on the other hand with delay. 我想编写一个脚本来检查服务器上的4个服务是否处于运行状态(当我们按顺序停止它们并在延迟时启动它们)。

First service must check that it is running and then start with others therefore we use delay. 第一个服务必须检查它是否正在运行,然后再从其他服务开始,因此我们使用延迟。

$serverlist = Get-Content “.\server.txt”
$servicename4 = "Orbit Utveckling Consul"
$servicename3 = "Orbit Utveckling Identity"
$servicename2 = "Orbit Utveckling Service"
$servicename1 = "Orbit Utveckling Integration"
$delay = 60 # Ange i sekunder.

foreach ($server in $serverlist) {
    $getservicestatus1 = Get-Service -Name $servicename1 -ComputerName $server
    if ($getservicestatus1 -eq "Running") {
        Set-Service -Name $servicename1 -ComputerName $server -Status stopped
        Write-Host "$server $servicename1 Stoppat!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan $servicename2 stoppar..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }
    $getservicestatus2 = (Get-Service -Name $servicename2 -ComputerName $server).status
    if ($getservicestatus2 -eq "Running") {
        Set-Service -Name $servicename2 -ComputerName $server -Status stopped
        Write-Host "$server $servicename2 Stoppat!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server stoppar..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }
    $getservicestatus3 = (Get-Service -Name $servicename3 -ComputerName $server).status
    if ($getservicestatus3 -eq "Running") {
        Set-Service -Name $servicename3 -ComputerName $server -Status stopped
        Write-Host "$server $servicename3 Stoppat!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server stoppar..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }
    $getservicestatus4 = (Get-Service -Name $servicename4 -ComputerName $server).status
    if ($getservicestatus4 -eq "Running") {
        Set-Service -Name $servicename4 -ComputerName $server -Status stopped
        Write-Host "$server $servicename4 Stoppat!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server stoppar..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }
}

# Filen startar tjänsten Drift_Cosmic på varje IX3a i txt-filen.
# Det görs med en delay på ett antal sekunder mellan varje start.
# Detta är en testfil tills dess att en riktig testkörning
# har gjorts i Drift.
Write-Host "$servicename4, $servicename3, $servicename2, $servicename1 startas med $delay sekunders mellanrum."

foreach ($server in $serverlist) {
    #   Skriv ut status på tjänsten i passande färg.
    $getservicestatus4 = (Get-Service -Name $servicename4 -ComputerName $server).status
    if ($getservicestatus4 -eq "Stopped") {
        Set-Service -Name $servicename4 -ComputerName $server -Status Running
        Write-Host "$server $servicename4 Startad!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server startas..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }

    $getservicestatus3 = (Get-Service -Name $servicename3 -ComputerName $server).status
    if ($getservicestatus3 -eq "Stopped") {
        Set-Service -Name $servicename3 -ComputerName $server -Status Running
        Write-Host "$server $servicename3 Startad!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server startas..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }

    $getservicestatus2 = (Get-Service -Name $servicename2 -ComputerName $server).status
    if ($getservicestatus2 -eq "Stopped") {
        Set-Service -Name $servicename2 -ComputerName $server -Status Running
        Write-Host "$server $servicename2 Startad!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server startas..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }

    $getservicestatus1 = (Get-Service -Name $servicename1 -ComputerName $server).status
    if ($getservicestatus1 -eq "Stopped") {
        Set-Service -Name $servicename1 -ComputerName $server -Status Running
        Write-Host "$server $servicename1 Startad!" -ForegroundColor Green
        Write-Host "Väntar i $delay sekunder innan nästa server startas..."
        $nexttime = (Get-Date).AddSeconds($delay)
        Write-Host "Nästa start sker $nexttime"
        Start-Sleep -Seconds $delay
    }
}

Write-Host "." -ForegroundColor DarkBlue
Read-Host "Tryck ENTER för att avsluta"

You can configure service dependencies so that a service will only start/stop once its dependent services are also started/stopped. 您可以配置服务依赖性,以便仅在其依赖性服务也已启动/停止后才启动/停止服务。

Once you've done this you only need to stop service1 and Windows will deal with stopping the services dependencies... in order of their dependents. 完成此操作后,您只需要停止service1 ,Windows将按其依赖项的顺序处理停止服务依赖项的问题。

You can see other services that have dependencies in Services. 您可以在“服务”中看到其他具有依赖性的服务。 For example Fax service depends on Print Spooler , which itself depends on RPC , which then depends on DCOM 例如, Fax服务依赖于Print Spooler ,后者本身依赖于RPCRPC随后依赖于DCOM

在此处输入图片说明

If manually stopped the Fax service, you'll see the GUI stop (in order) DCOM, RPC, Spooler then Fax. 如果手动停止了Fax服务,您将看到GUI停止(按顺序)依次是DCOM,RPC,后台打印程序和传真。


Configuring dependencies only needs to be done once (per server): 配置依赖项仅需要执行一次(每个服务器):

sc config "service1" depend= "service2"
sc config "service2" depend= "service3"
sc config "service3" depend= "service4"
etc...

(There's no native Powershell command for doing this to my knowledge, I've only found sc.exe and using wmi, with sc being the simpler command.) (据我所知,没有执行此操作的本机Powershell命令,我仅找到sc.exe并使用wmi,而sc是更简单的命令。)

After this is setup you would only need a small bit of code to restart all the services in order: 设置完成后,您只需要少量代码即可按顺序重新启动所有服务:

$serverlist = Get-Content ".\server.txt"
foreach ($server in $serverlist) {
    Get-Service -Name "service1" -ComputerName $server | Restart-Service
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM