【问题标题】:Launching background tasks in a remote session that don't get killed when the session is removed在远程会话中启动在会话被删除时不会被终止的后台任务
【发布时间】:2012-01-30 08:13:48
【问题描述】:

我一直在使用 PsExec -d 在远程 powershell 会话中启动控制台应用程序,因为我希望这些应用程序在我执行某些任务时在后台运行。问题是我希望后台应用程序继续运行,即使我使用Remove-PSSession 终止远程 powershell 会话。当前发生的情况是,一旦远程 powershell 会话被终止,在PsExec -d 的帮助下启动的所有进程也会被终止。我猜它与进程树以及 Windows 如何管理此类事物的生命周期有关。

有谁知道如何启动远程后台进程并让该进程在远程会话被终止后仍然存在?

【问题讨论】:

    标签: powershell powershell-2.0 psexec powershell-remoting


    【解决方案1】:

    这里首先解释一下为什么会这样。也许其他人可以使用它来带来另一种解决方案。

    我使用基于 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。

    默认情况下,一方面此作业不支持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 启动程序,但在另一份工作中。默认情况下,与作业关联的进程使用 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 fallait démontrer”

    【讨论】:

    • 感谢 JPBlanc 的分析。我目前的解决方法是简单地使用远程会话来收集用于从远程会话外部使用PsExec -d 启动进程的信息。这样,当远程会话被终止时,以PsExec -d 启动的进程不会。
    • @davidk01 我想我找到了一个干净的解决方案,我编辑了我的答案来解释它。
    • 感谢您的精彩帖子。它为我节省了更多时间来搜索如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多