远程进程被神秘杀死

remote process getting killed mysteriously

我正在 运行使用 PowerShell 连接一个远程进程,它似乎在几分钟后就被杀死了。

我使用的命令如下:

$command = {Start-Process -NoNewWindow -Wait -FilePath $filepath -ArgumentList $args}
Invoke-Command -Session $MyPSSession -ScriptBlock $command

在对计算机进行远程桌面操作时,我查看了任务管理器:该进程在列表中,并且占用的内存和 CPU 资源与往常一样多(即好像我直接在机器而不是使用 Invoke-Command),但在 3 到 6 分钟后,该过程停止而没有任何痕迹。

有什么方法可以防止这种行为吗?我的进程平均应该 运行 很长一段时间(超过 10 分钟),但无论如何它都会被杀死。

编辑 1:好的,所以我用 procmon 调试了这个问题,似乎就在进程结束之前启动了退出代码 3。我查了一下,它是 "System could not find path specified"。这又是一个谜,因为 运行 直接在机器上运行进程不会触发这样的退出代码。

...那么有没有办法知道进程正在寻找哪条路径?

编辑 2:确实有一种方法可以知道进程无法访问哪条路径,但在我的情况下,procmon 记录了数千个(!!!)结果为 "NAME NOT FOUND" 的事件操作 "RegOpenKey" 等等。 另外,我的远程机器似乎很难使用 CreateFileMapping 函数,它总是 return "FILE LOCKED WITH ONLY READERS",无论它试图 "map"...

编辑 3:我发现进入预先创建的会话然后 运行 进程改变了行为,但进程在启动后的一段时间内仍然被终止,这次退出代码为 ' -1073741819' ... 即 "Access Denied"。将进一步调查。

编辑 4:在远程机器上,PS 版本是 2.0。在我的工作站上,PS 版本是 5.0。我安装了 Service Pack 1、.NET Framework 4.5.2 和 WMF 5.0(包含 powerShell 5.0)。直到今天,这个过程都运行良好,并没有神秘地死去,但现在它确实在几秒钟后吐出一个退出代码 3。我尝试 运行 我的远程机器上的另一个应用程序:我让它完成并输出结果,即使这个过程花费的时间超过那几秒钟。 "Then it must be the app!" 我告诉自己...不!当我 运行 具有相同参数的相同应用程序从 VM 到我的工作站时,它工作得很好。 "It must be the remote machine then!" ... 是的,关于那个。我如何能够识别这两台机器之间的差异并修复远程机器以便我可以 运行 从我的工作站上安装我的应用程序?

在远程机器上,PS版本是 2.0。在我的工作站上,PS版本是 5.0。我在远程机器上安装了 Service Pack 1、.NET Framework 4.5.2 和 WMF 4.0(包括 PowerShell 4.0),然后我从我的工作站远程启动了我的进程,它比以往任何时候都更健康。

结论:使用 PowerShell 2.0 进行远程处理对于长期进程来说不是一个好的解决方案,并且肯定会在以后引起问题,特别是如果接收机器是 运行 旧版本的 PS .

本周课程:更新你的东西,伙计们。