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-ID: 4730579881

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

Ausgedruckt am: 19.11.2024 um 06:11 Uhr

emeriks
Lösung emeriks 23.11.2022 aktualisiert um 08:19:54 Uhr
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.
emeriks
emeriks 23.11.2022 um 08:19:11 Uhr
Goto Top
Bsp.
notepad
exit

vs.

start /wait notepad
exit
Crusher79
Crusher79 23.11.2022 aktualisiert um 09:11:53 Uhr
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; }
Crusher79
Crusher79 23.11.2022 um 09:15:26 Uhr
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!