【问题标题】:Powershell Crash after couple of hours几个小时后Powershell崩溃
【发布时间】:2017-05-21 07:38:45
【问题描述】:

我的 Powershell 脚本遇到了奇怪的情况。 我编写了一个执行 .exe 文件的脚本 此 exe 运行时间约为 3 小时,但在 2 小时后不断崩溃(或多或少 1-2 分钟)

我想弄清楚为什么进程崩溃了 最终我发现 .exe 崩溃是因为 powershell 崩溃了。

这里是流程执行命令:

$Proc = Start-Process -FilePath $ExePath -ArgumentList $Arguments -NoNewWindow -PassThru
$Proc | Wait-Process -Timeout 28800 -ea 0 -ev timeouted

在我意识到 Powershell 引起的这个问题后,我启用了 windows powershell 日志记录并发现错误消息“管道已停止”

脚本需要在进程结束后执行更多操作并获取其退出代码,这就是我使用 -PassThru 标志的原因。 我尝试在不使用 PassThru 标志或 Process-Wait 命令的情况下运行它,结果保持不变(进程在 2 小时后崩溃,但没有显示“管道已停止”消息的日志)

要点:

  1. .exe 文件被 try;catch 块与记录器弄脏,但在崩溃时没有记录任何内容 - 这不是 .exe 文件中的运行时错误
  2. 从命令行独立运行 .exe 时,它​​会在大约 3 小时后成功完成
  3. Powershell 脚本以管理员权限运行
  4. 由于 CPU/内存/磁盘使用率高,exe 无法解决崩溃问题

一旦有更多更新,我会跟进。

感谢所有帮助者。 非常感谢您的帮助!

【问题讨论】:

  • 哪个版本的 PowerShell ?
  • 嗨,我用的是 4.0

标签: windows powershell crash powershell-4.0


【解决方案1】:

在我看来,Start-Process cmdlet 适合快速处理。但是,在尝试调试 exe 为何不正常运行时,还有很多不足之处。

要在您的情况下解决此问题,使用 .Net 对象来重定向和更改有关您的实例化的某些内容可能会很有用。我在下面放了一个示例函数,我在调试 exe 运行时遇到问题。

function Start-Exe
{
    param
    ( [string]$exePath, [string]$args1 )

    $returnVal = $false
    $pinfo = New-Object System.Diagnostics.ProcessStartInfo
    $pinfo.FileName = $exePath
    $pinfo.RedirectStandardError = $true
    $pinfo.RedirectStandardOutput = $true
    $pinfo.UseShellExecute = $false
    $pinfo.Arguments = $args1
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = $pinfo
    $p.Start() | Out-Null
    $p.WaitForExit()
    $stdout = $p.StandardOutput.ReadToEnd()
    $stderr = $p.StandardError.ReadToEnd()
    $exitCode = $p.ExitCode
    #OutputFile can be some log file, or just use write-host to pump to console
    #$stdout | Add-Content $global:OutputFile
    #$stderr | Add-Content $global:OutputFile

    return $exitCode
}

【讨论】:

  • 嗨,大卫,感谢您的回复。我知道exe执行有问题。 powershell 进程崩溃(当我独立运行 exe 时,一切运行顺利,退出代码为 0)
【解决方案2】:

你可以不使用Wait-Process试试看是否可以重现。

Start-Process 带有-Wait 参数。

或在没有-Wait 的作业中创建它并使用Wait-.Job cmdlet 等待作业

【讨论】:

  • 你好,我已经试过了,看起来exe进程注册在Powershell进程下的CPU之类的东西上,虽然PS进程已经完成了。
【解决方案3】:

我在尝试执行 8 小时的进程时出现了同样的症状,它总是在 2 小时后死机,你需要清除 powershell IdleTimeout。

This answer helped me

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多