Ich habe also ein Skript, das alle Server aus einer Liste heraussucht und pingt, die in SQL Server gespeichert ist. Das Skript funktioniert gut, aber es macht alles nacheinander (lahm).
Kann mir jemand helfen, wie ich das ändern würde, um Multithreading anstatt einer foreach-Schleife zu verwenden?
%Vor%Wenn Sie PowerShell 2.0 verwenden, können Sie Hintergrundjobs verwenden. Sie müssen Ihre Serverliste in "Gruppen" aufteilen. Gegeben eine Quelltabelle mit serverName und groupName:
%Vor%Eine kleine Änderung an Ihrem Skript (Speichern als forum.ps1):
%Vor%Sie können dann das Skript für verschiedene Gruppen aufrufen:
%Vor%Wenn Sie PowerShell V1 oder sqlps verwenden, können Sie mit System.Diagnostics.ProcessStartInfo separate powershell.exe-Prozesse starten und den Gruppennamen übergeben.
%Vor%(Bearbeitet gemäß Chad Millers Vorschlag + Drosselungsanforderung + Warte-Job-Korrektur + STA-Korrektur)
Support.ps1
%Vor%Haupt.ps1
%Vor%Powershell führt Multithreading nicht wirklich durch. Ich habe es geschafft, es in die richtige Position zu bringen, indem ich es mit einem Fire-and-Forget-Skript vorgetäuscht habe, das mit "start [powershell path] scriptname.ps1" gestartet wurde. Es wird mehrere Insanzen auslösen, aber Sie können keine Daten von ihnen zurückholen, ohne einen Endlauf über eine Datenbank oder einen anderen Nachrichtenübergabemechanismus auszuführen. Das Nachverfolgen, wenn die Kindprozesse beendet werden, ist ebenfalls schwierig.
%Vor%In Ihrem Fall, wenn Sie eine SQL-Zeichenfolge als Teil der foreach-Schleife festlegen, können Sie versuchen, den DB-Aktualisierungscode in ein zweites Skript einzufügen, das Sie auslösen. Sie haben möglicherweise viele verschiedene Prozesse, die versuchen, die gleiche Datenbanktabelle zu aktualisieren, so dass das Potenzial für Timing-Probleme ziemlich groß ist.
Da Sie auch neue Powershell-Instanzen starten, werden Sie eine Menge Speicher verbrauchen, damit es funktioniert. Die foreach-Schleife kann einfach schneller sein als einen Haufen Prozesse zu starten.
So kann es gemacht werden, aber es ist nichts, was sogar hübsch aussieht.
Zuerst schlage ich vor, nur einmal die Variable $ ping außerhalb des 'foreach ..' zu erstellen.
Vielleicht eine einfachere Lösung ... jetzt, da Sie SQL 2008 verwenden, warum verwenden Sie nicht die SMO-Methode 'enumAvailableSqlServers: "... SMOApplication] :: EnumAvailableSqlServers ($ false)". Dadurch erhalten Sie eine Liste aller verfügbaren Server im Netzwerk. Hier ist der Microsoft MSDN-Link, so dass Sie darüber lesen können:
Ссылка
so nah ... das ist es, was ich habe
%Vor%und es scheint mehrere Jobs zu starten ... aber mein Tisch wird nie aktualisiert. Wenn ich die "Start-Job" -Sache und die Argumentliste entferne und $ srv.ServerName verwende, dann funktioniert es sequenziell wie zuvor. Irgendwelche Ideen? (Vielen Dank für alle Antworten)
Tags und Links sql powershell