Multithreading-Hilfe mit Powershell

8

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%     
ColinStasiuk 13.07.2010, 17:10
quelle

7 Antworten

2

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%     
Chad Miller 13.07.2010, 21:56
quelle
4

(Bearbeitet gemäß Chad Millers Vorschlag + Drosselungsanforderung + Warte-Job-Korrektur + STA-Korrektur)

Support.ps1

%Vor%

Haupt.ps1

%Vor%     
George Howarth 13.07.2010 20:41
quelle
0

Hier ist eine Seite mit einem Skript, das für Sie nützlich sein könnte. Ich habe es noch nicht selbst benutzt, daher kann ich darüber hinaus nichts sagen.

    
Tom H 13.07.2010 17:24
quelle
0

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.

    
sysadmin1138 13.07.2010 17:24
quelle
0

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: Ссылка

    
Max Trinidad 13.07.2010 18:56
quelle
0

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)

    
ColinStasiuk 13.07.2010 21:46
quelle
0

Hier ist ein Skript von Jim Truher für Hintergrundjobs in PowerShell v1.0:

Ссылка

In PowerShell v2.0 sind Hintergrundjobs integriert:

Ссылка

-Oisin

    
x0n 14.07.2010 01:03
quelle

Tags und Links