ralus67
Goto Top

Batch Befehle sollen warten bis vorgängiger Dienst beendet ist

Hallo Community

Ist es möglich in einer Batch Datei, welche mehrere Befehle bzw. weitere Batch Dateien aufruft, sicherzustellen, dass die nachfolgenden Befehle und Batchdateien erst ausgeführt wird, wenn der vorgängige Befehl bzw. Ausführungs- /Installationsienst beendet wurde?

Content-Key: 4730579881

Url: https://administrator.de/contentid/4730579881

Printed on: April 24, 2024 at 04:04 o'clock

Member: emeriks
Solution emeriks Nov 23, 2022 updated at 07:19:54 (UTC)
Goto Top
Hi,
jain.
Man kann Anwendungen (Befehle) über
start 
starten. Dies hat den Parameter "/wait", mit welchen man anweisen kann, dass beim Starten von GUI-Anwendungen (Nicht-Konsolen-Anwendungen), welche sonst "asynchron" ausgeführt würden, auf deren Beendigung gewartet wird, bevor zur Kommandozeile zurückgekehrt wird. Sprich, bevor die nächste Zeile der batch abgearbeitet wird.
Allerdings hat das keinen Effekt, wenn das ausgeführte Programm Hintergrund-Aufgaben startet. Auf diese Hintergrundaufgaben kann man nur durch explizite Abfragen derer Ausführungszustände warten.

E.
Member: emeriks
emeriks Nov 23, 2022 at 07:19:11 (UTC)
Goto Top
Bsp.
notepad
exit

vs.

start /wait notepad
exit
Member: Crusher79
Crusher79 Nov 23, 2022 updated at 08:11:53 (UTC)
Goto Top
Hallo,

würde da auf PowerShell gehen. Da man relativ einfach schleifen bauen kann. Bzw. ist das Handling schöner. Es gibt ja meist ein Zeitproblem. Mitunter laufen sich Prozessea auch tot.

Schleife kann kontinuierlich prüfen. Man kann Delay von 10 oder 60 Sekunden einbauen, damit es nicht Dauerfeuer auf die Dienste o.ä. macht. Ist die Bedingung X erfüllt, geht es weiter.

Oder man nimmt fix Zeiten. Und behauptet der Dienst müsste nach 30 Sekunden definitiv unten sein,. Wenn nicht hart killen. Killen ist immer unschön. Hier ein MS SQL 2000 Server und ein tomcat Dienst auf einen Linux Server.

Hier wurde aber pauschal hart 30 Sekunden unterstellt.

Ich würde für dein Vorhaben - ja nachdem wie sensibel die Dienste sind - Konzept mit PowerShell und if-Block empfehlen.

Neben Diensten kann PowerShell auch Log Files lesen und du kannst den Inhalt im Script auswerten. Du hast alles zur Verfügung, was man auch unter Windows GUI sieht. Mit einer sinnvollen Kombination dieser Instrumente sollte man Zeiten gering halten und die Verabeitung "robust" gestalten können.
if (!($found)) {
    Invoke-Command -ComputerName WS2-SQL -Credential $cred `
    -ScriptBlock { `
    $JobA = Start-Job { `
            stop-service -name "SQLSERVERAGENT" -force -passThru -ErrorAction Continue `  
        }; `    
    Start-Sleep 30 ; `    
    $JobS = Start-Job { `
            stop-service -name "MSSQLSERVER" -force -passThru -ErrorAction Continue `  
        }; `
    Start-Sleep 30; `
    cmd /c taskkill /f /im sql*; `   
    Start-Sleep 5; `
    Start-Service -Name "MSSQLSERVER"; `  
    Start-Sleep 30; `
    Start-Service -Name "SQLSERVERAGENT"; `  
    }

    Start-Sleep 5
    cmd /c "C:\ProgramData\chocolatey\bin\plink.exe  root@web02 -batch -i C:\fl-system\putty-private.ppk (systemctl restart tomcat8)"  

    WriteLog "xyneu gestartet!"  

} ELSE { WriteLog "xy läuft!" }  

Hier ein Einzeiler der Dienst neustart überwacht. Die Funtktion läd dafür eine Ref.-Webseite Das kann bei dir alles sein. Query auf Dienste etc.

Am Ende hat man nur einen While-Loop.

Function QueryXYZ() {
            [boolean]$found = $false
            $WebResponse = ""  
            $authstr = $BMVuser+':'+$BMVpwd  
            $creds = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($authstr))
            $WebResponse = Invoke-WebRequest $BMVurl -TimeoutSec 60 `
            -Headers @{ 'Authorization' = 'Basic ' + $creds }	  
            $h2 = $WebResponse.AllElements | Where {$_.TagName -eq "h2"}  
            [boolean]$Script:found = $h2.outerText -eq $BMVtestAuftrag
            }

while ((!($found)) -and $whileLoopCtr -lt 21) { QueryXYZ; Start-Sleep 5; $whileLoopCtr+=1; }
Member: Crusher79
Crusher79 Nov 23, 2022 at 08:15:26 (UTC)
Goto Top
@Ralus67 was für Installationen?

https://chocolatey.org/

Die Pakete werden nacheinander installiert. Für Default Programme kann man es sich damit einfach machen. Man erhält am Ende auch ein Log Datei.

Du hast leider nicht geschrieben was für Programme.

Ggf. hilft dir eine Kombination und Choco Repros und selbstgebauten Script!