在远程会话中启动后台任务,当会话被删除时不会被终止
我一直在使用PsExec -d
在远程PowerShell会话中启动控制台应用程序,因为我希望这些应用程序在后台运行,同时执行某些任务。问题是,即使我使用Remove-PSSession
杀死远程PowerShell会话,我也希望后台应用程序继续运行。目前发生的情况是,一旦远程PowerShell会话被终止,所有在PsExec -d
帮助下启动的进程。我猜测它与流程树有关,以及Windows如何管理这些事情的生命周期。在远程会话中启动后台任务,当会话被删除时不会被终止
有没有人有任何想法如何启动远程后台进程,并让该进程在远程会话被终止后仍然存在?
这里首先解释它为什么如此工作。也许别人可以用它来提供另一种解决方案。
我使用基于WMI的解决方案编辑了我的答案。
当你输入一个远程会话:
PS C:\Users\JPB> enter-PSSession -ComputerName 192.168.183.100 -Credential $cred
[192.168.183.100]: PS C:\Users\jpb\Documents>
您这个过程被称为wsmprovhost.exe
在服务器上创建如下所示下
如果只是在这个远程会话启动一个进程:
[192.168.183.100]: PS C:\Users\jpb\Documents> Start-Process calc.exe
新工艺是wsmprovhost.exe
孩子如下所示
下,如果停止远程会话wsmprovhost.exe
消失,所以子进程。
解释是,wsmprovhost.exe
和这个启动的所有进程属于同一个工作。
默认情况下,一方面,这工作并不支持JOB_OBJECT_LIMIT_BREAKAWAY_OK
限制标志,不允许我们启动一个进程与CREATE_BREAKAWAY_FROM_JOB
标志,在另一方面,这种工作支持,导致所有进程JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
极限标志与作业相关联,以在作业的最后一个句柄关闭时终止。
它可能存在一个解决方案来配置WinRM以支持支持JOB_OBJECT_LIMIT_BREAKAWAY_OK
的作业。
编辑:
所以阅读Microsoft documentation,我发现你开始通过WinRM的,但在onother工作的程序文件的技术途径。默认情况下,与作业关联的进程使用CreateProcess创建的进程与作业相关联;但是,使用Win32_Process.Create创建的进程与作业没有关联。
所以,如果你在远程会话创建这样与WMI的过程:
PS C:\silogix> $ps = New-PSSession -ComputerName 192.168.183.100 -Credential $cred
PS C:\silogix> Enter-PSSession -Session $ps
[192.168.183.100]: PS C:\Users\jpb\Documents> Invoke-WmiMethod -path win32_process -name create -argumentlist "calc.exe"
__GENUS : 2
__CLASS : __PARAMETERS
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 1236
ReturnValue : 0
[192.168.183.100]: PS C:\Users\jpb\Documents> exit
PS C:\silogix> Remove-PSSession $ps
如果停止远程会话wsmprovhost.exe消失,但根据服务器上展示新工艺留在这儿:
的过程开始与WMI不属于任何工作。在法国我会说“Ce qu'il fallaitdémontrer”
感谢分析JPBlanc。我目前的解决方法是简单地使用远程会话来收集用于从远程会话外部使用'PsExec -d'启动进程的信息。这种方式当远程会话被终止时,以'PsExec -d'开始的进程不是。 – davidk01 2012-01-03 04:13:23
@ davidk01我想我找到了一个干净的解决方案,我编辑了我的答案来解释它。 – JPBlanc 2012-01-04 09:31:32
感谢您的好评。它为我节省了更多的搜索时间,如何做到这一点。 – 2012-11-15 07:00:11