【问题标题】:Wonky Start-Process errors after the script has been running a while脚本运行一段时间后出现 Wonky Start-Process 错误
【发布时间】:2011-10-05 01:40:42
【问题描述】:

我有一个 PowerShell 2.0 脚本,它可以从上到下处理大型文件共享,通过 Start-Process 启动另一个可执行文件并等待结果和退出代码来更正权限等,代码如下:

Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;

该脚本可以运行几个小时,处理数千个条目,然后最终会开始出现类似以下的奇怪错误:

  • "Start-Process : 由于进程 (PID) 已退出,无法处理请求。" -- 所以进程关闭得太快以至于没有返回任何状态?

  • "Start-Process : 由于错误无法执行此命令:没有足够的存储空间来处理此命令。" -- 文件上有超过 20GB 的可用空间分享我正在研究的内容,以及我测试过的两个不同系统上的系统驱动器(更不用说大量的可用 RAM 和虚拟内存)。

请注意,我使用的是内置的 Start-Process cmdlet,而不是 PSCX ——但顺便说一下,它的行为方式相同(因为它们都基于 .NET's Process class)。

另请注意,它看起来一点也不像内存管理问题 - PowerShell 进程在进程早期的工作集小于 100MB 时达到峰值,并且在运行数小时后永远不会超过该值。

有人知道如何阻止这些错误吗?或者,如何调试它们?

-----解决办法-----

感谢@JPBlanc 指出以下解决方案:

1.) 为了解决“没有足够的存储空间来处理此命令”错误,我在托管文件共享的本地服务器上运行了 PowerShell 脚本(而不是通过受某些内存影响的 CIFS 共享)限制)。

2.) 为了解决“无法处理请求,因为进程 (PID) 已退出”错误,我不得不添加对 System.Diagnostics.Process 对象的 HasExited 属性的额外测试,如下所示:

$ps = Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
do {} until ($ps.HasExited); # wait...
$ps.ExitCode; # <-- this is what I really needed from the output

脚本现在运行没有错误!

【问题讨论】:

  • 脚本是否在远程机器上共享或共享的同一框中工作?
  • 通常在远程机器上,因为托管文件共享的盒子没有安装 PowerShell(并且 24x7 全天候使用)。
  • 您是否测试过使用 [Diagnostics.Process] 转换您的代码?

标签: powershell powershell-2.0


【解决方案1】:

当您在共享上运行脚本时,这可能是由于服务器服务耗尽了进程内存、系统上的某个进程消耗了内存句柄并且没有正确释放它们,there are some test advices on this post。过去,我曾经在一个应用程序上遇到类似的错误,该应用程序在共享上打开大量文件,修改 IRPStackSize 注册表项似乎有帮助。

----已编辑-----

据我了解“无法处理请求,因为进程 (PID) 已退出”是因为在 Start-Process 下使用了 [Diagnostics.Process] 并且 -Wait 参数在未测试 @ 的情况下播放987654325@ 属性是真还是假。为了纠正这个错误,我会检测我的代码以准确发现它附加在哪个文件上。对我来说,这个错误是由于你的 $exe 使用 $allargs 调用的特定错误造成的。

【讨论】:

  • 哇...这个解释很有道理。我会尽快检查的——谢谢!
  • 好消息: 在本地运行脚本似乎可以避免“没有足够的存储空间来处理此命令”错误:万岁! 坏消息:它仍然收到“无法处理请求,因为进程(PID)已退出”错误。
  • 我编辑了我的答案,给你一些线索,但我不确定在没有上下文的情况下能够帮助你。我相信我的回答有点用处。
  • 同意——你帮了很多忙!但我仍在试图找出进程错误...我不知道微软是如何实现 PowerShell 的Start-Process -Wait 选项的;我认为这意味着要等到.HasExited 为真。你认为它与输出文件有关吗?我会尝试用Out-Null 等替换它们,看看丢弃输出是否有帮助(它可能也会运行得更快)。
  • 您是否尝试检测您的代码以了解哪些文件失败了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2021-03-17
  • 2019-08-23
  • 2020-08-02
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多