Moin!
Ich habe ein Script, das ein anders Script 10 mal startet, dann auf wartet, dass alle 10 Jobs beendet sind, um danach deren Ausgabe anzuzeigen. Was ich nicht verstehe, ist, warum das so lange dauert.
Hier das äußere Script (c:\ps\tst.ps1):
$Logfile="C:\ps\tst.log"
##############################################################
# Schreibt "LogData" mit vorangestelltem Timestamp in die
# Logdatei (gemäß $Logfile).
Function LogWrite($LogData) {
$LogTime=Get-Date -Format "yyyy-dd-MM HH:mm:ss"
$LogMsg=$LogTime + " " + $LogData
Add-content $Logfile -Value $LogMsg
}
$jobs=@()
for($i=0; $i -lt 10; $i++) {
$jobs+=Start-Job -Name ("job{0}" -f $i) -filepath C:\ps\sub.ps1 -ArgumentList @("job", $i)
LogWrite ("Job{0} gestartet" -f $i)
}"warten, bis alle fertig"
do {
Start-Sleep -Milliseconds 200
$stillRunning=$false
foreach($jobstate in $jobs.State) {
if($jobstate -eq "Running") {
$stillRunning=$true
break
}
}
} while($stillRunning)"alle sind fertig"
foreach($job in $jobs) {
receive-job -job $job
}
Get-Job | Remove-Job
Und das innere (c:\ps\sub.ps1):
param([string]$nam, [string]$nr)
$Logfile="C:\ps\sub.log"
##############################################################
# Schreibt "LogData" mit vorangestelltem Timestamp in die
# Logdatei (gemäß $Logfile).
Function LogWrite($LogData) {
$LogTime=Get-Date -Format "yyyy-dd-MM HH:mm:ss"
$LogMsg=$LogTime + " " + $LogData
Add-content $Logfile -Value $LogMsg
}
LogWrite "nam=", $nam, "nr=", $nr
$r=Get-Random -Minimum 0 -Maximum 5000
Start-Sleep -Milliseconds $r
LogWrite "nam=", $nam, "nr=", $nr, "rand=", $r
Write-Host "nam=", $nam, "nr=", $nr, "rand=", $r
exit 0
Wenn ich .\tst.ps1 laufen lasse, gibts folgende Ausgabe:
PS C:\ps> .\tst.ps1
warten, bis alle fertig
alle sind fertig
nam= job nr= 0 rand= 2817
nam= job nr= 1 rand= 3766
nam= job nr= 2 rand= 2512
nam= job nr= 3 rand= 4742
nam= job nr= 4 rand= 282
nam= job nr= 5 rand= 1258
nam= job nr= 6 rand= 3766
nam= job nr= 7 rand= 1536
nam= job nr= 8 rand= 4306
Stream was not readable.+ CategoryInfo : InvalidArgument: (C:\ps\sub.log:String) [Add-Content], ArgumentException+ FullyQualifiedErrorId : GetContentWriterArgumentError,Microsoft.PowerShell.Commands.AddContentCommand+ PSComputerName : localhost
nam= job nr= 9 rand= 282
PS C:\ps>
Die Logdatei tst.log hat diesen (durchaus akzeptablen) Inhalt:
2016-11-02 17:35:55 Job0 gestartet
2016-11-02 17:35:55 Job1 gestartet
2016-11-02 17:35:55 Job2 gestartet
2016-11-02 17:35:55 Job3 gestartet
2016-11-02 17:35:55 Job4 gestartet
2016-11-02 17:35:56 Job5 gestartet
2016-11-02 17:35:56 Job6 gestartet
2016-11-02 17:35:56 Job7 gestartet
2016-11-02 17:35:56 Job8 gestartet
2016-11-02 17:35:56 Job9 gestartet
Aber sub.log diesen:
2016-11-02 17:36:14 nam= job nr= 0
2016-11-02 17:36:17 nam= job nr= 0 rand= 2817
2016-11-02 17:36:22 nam= job nr= 1
2016-11-02 17:36:22 nam= job nr= 6
2016-11-02 17:36:22 nam= job nr= 3
2016-11-02 17:36:22 nam= job nr= 7
2016-11-02 17:36:22 nam= job nr= 2
2016-11-02 17:36:22 nam= job nr= 8
2016-11-02 17:36:22 nam= job nr= 4
2016-11-02 17:36:22 nam= job nr= 9
2016-11-02 17:36:22 nam= job nr= 5
2016-11-02 17:36:22 nam= job nr= 4 rand= 282
2016-11-02 17:36:23 nam= job nr= 5 rand= 1258
2016-11-02 17:36:23 nam= job nr= 7 rand= 1536
2016-11-02 17:36:24 nam= job nr= 2 rand= 2512
2016-11-02 17:36:25 nam= job nr= 1 rand= 3766
2016-11-02 17:36:25 nam= job nr= 6 rand= 3766
2016-11-02 17:36:26 nam= job nr= 8 rand= 4306
2016-11-02 17:36:26 nam= job nr= 3 rand= 4742
1.) warum, verdammt nochmal, dauert es nach Start des letzten Jobs um 17:35:56 bis 17:36:14, bevor der erste Logeintrag von sub.ps1 geschrieben wird?
2.) in sub.ps1 wird maximal fünf Sekunden gewartet - warum liegen die Logeinträge aber zwischen 17:36:14 und 17:36:26?
Selbst wenn ich sämtliches Log-Schreiben auskommentiere, läuft das Script immer noch ca. 20 Sekunden. Kann also nicht [nur] daran liegen, das ein Job die Logdatei mit seinem Schreibzugriff sperrt. BTW: der "Add-content" schließt die Logdatei doch
wohl hoffentlich unmittelbar nachdem reingeschrieben hat !?
Ich verstehe es nicht.... :-(
Vielen Dank im voraus für Tipps, wie man erreicht, dass .\tst.ps1 nach maximal sechs Sekunden fertig ist.