当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于远程工作

作者:精品下载站 日期:2024-12-14 02:19:13 浏览:12 分类:玩电脑

关于远程工作


简短描述

描述如何在远程计算机上运行后台作业。

详细说明

PowerShell 通过作业同时运行命令和脚本。 PowerShell 提供了三种作业类型来支持并发。

  • RemoteJob - 命令和脚本在远程会话中运行。
  • BackgroundJob - 命令和脚本在本地计算机上的单独进程中运行。有关更多信息,请参阅 about_Jobs。
  • PSTaskJobThreadJob - 命令和脚本在本地计算机上同一进程内的单独线程中运行。有关详细信息,请参阅 about_Thread_Jobs。

在单独的计算机或单独的进程中远程运行脚本可以提供很好的隔离。远程作业中发生的任何错误都不会影响其他正在运行的作业或启动该作业的父会话。然而,远程处理层增加了开销,包括对象序列化。所有对象在父会话和远程(作业)会话之间传递时都会被序列化和反序列化。大型复杂数据对象的序列化可能会消耗大量计算和内存资源,并通过网络传输大量数据。

这很重要

创建作业的父会话还会监视作业状态并收集管道数据。一旦作业达到完成状态,作业子进程就会被父进程终止。如果父会话终止,所有正在运行的子作业及其子进程都会终止。

有两种方法可以解决这种情况:

  1. 使用 Invoke-Command 创建在断开连接的会话中运行的作业。请参阅本文的分离进程部分。
  2. 使用 Start-Process 创建新进程而不是作业。有关详细信息,请参阅启动进程。

远程工作

您可以使用三种不同的方法在远程计算机上运行作业。

  • 在远程计算机上启动交互式会话。然后在交互式会话中启动作业。尽管所有操作都是在远程计算机上执行,但这些过程与运行本地作业相同。

  • 在远程计算机上运行作业,将其结果返回到本地计算机。当您想要收集作业结果并将其维护在本地计算机上的中央位置时,请使用此方法。

  • 在远程计算机上运行作业,并在远程计算机上维护其结果。当作业数据在原始计算机上得到更安全的维护时,请使用此方法。

在交互式会话中启动作业

您可以启动与远程计算机的交互式会话,然后在交互式会话期间启动作业。有关交互式会话的更多信息,请参阅 about_Remote 和 Enter-PSSession

在交互式会话中启动作业的过程与在本地计算机上启动后台作业的过程几乎相同。但是,所有操作都发生在远程计算机上,而不是本地计算机上。

  1. 使用 Enter-PSSession cmdlet 启动与远程计算机的交互式会话。您可以使用 Enter-PSSession 的 ComputerName 参数为交互式会话建立临时连接。或者,您可以使用 Session 参数在 PowerShell 会话 (PSSession) 中运行交互式会话。

    以下命令在 Server01 计算机上启动交互式会话。

    C:\PS> Enter-PSSession -computername Server01
    

    命令提示符发生更改,显示您现在已连接到 Server01 计算机。

    Server01\C:>
    
  2. 要在会话中启动远程作业,请使用 Start-Job cmdlet。以下命令运行一个远程作业,该作业获取 Server01 计算机上 Windows PowerShell 事件日志中的事件。 Start-Job cmdlet 返回一个表示作业的对象。

    此命令将作业对象保存在 $job 变量中。

    Server01\C:> $job = Start-Job -scriptblock {
      Get-Eventlog "Windows PowerShell"
    }
    

    当作业运行时,您可以使用交互式会话来运行其他命令,包括其他作业。但是,您必须保持交互式会话打开,直到作业完成。如果结束会话,作业就会中断,结果也会丢失。

  3. 要查明作业是否已完成,请显示 $job 变量的值,或使用 Get-Job cmdlet 获取作业。以下命令使用 Get-Job cmdlet 来显示作业。

    Server01\C:> Get-Job $job
    
    SessionId  Name  State      HasMoreData  Location   Command
    ---------  ----  -----      -----------  --------   -------
    1          Job1  Complete   True         localhost  Get-Eventlog "Windows...
    

    Get-Job 输出显示作业正在“localhost”计算机上运行,因为该作业是在同一台计算机(在本例中为 Server01)上启动并运行的。

  4. 要获取作业的结果,请使用 Receive-Job cmdlet。您可以在交互式会话中显示结果或将它们保存到远程计算机上的文件中。以下命令获取 $job 变量中的作业结果。该命令使用重定向运算符 (>) 将作业结果保存在 Server01 计算机上的 PsLog.txt 文件中。

    Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
    
  5. 要结束交互式会话,请使用 Exit-PSSession cmdlet。命令提示符发生更改,显示您已返回本地计算机上的原始会话。

    Server01\C:> Exit-PSSession
    C:\PS>
    
  6. 要随时查看 Server01 计算机上的 PsLog.txt 文件的内容,请启动另一个交互式会话,或运行远程命令。如果您想要使用多个命令来调查和管理 PsLog.txt 文件中的数据,这种类型的命令最好在 PSSession(持久连接)中运行。有关 PSSession 的更多信息,请参阅 about_PSSessions。

    以下命令使用 New-PSSession cmdlet 创建连接到 Server01 计算机的 PSSession,并使用 Invoke-Command cmdlet在 PSSession 中运行 Get-Content 命令来查看文件的内容。

    $s = New-PSSession -computername Server01
    Invoke-Command -session $s -scriptblock {
      Get-Content c:\logs\pslog.txt}
    

启动将结果返回到本地计算机的远程作业 (AsJob)

要在远程计算机上启动作业并将命令结果返回到本地计算机,请使用 cmdlet(例如 Invoke-Command cmdlet)的 AsJob 参数。

当您使用AsJob参数时,即使作业在远程计算机上运行,作业对象实际上也是在本地计算机上创建的。作业完成后,结果将返回到本地计算机。

您可以使用包含作业名词的 cmdlet(作业 cmdlet)来管理任何 cmdlet 创建的任何作业。许多具有 AsJob 参数的 cmdlet 不使用 PowerShell 远程处理,因此您甚至可以在未配置远程处理且不满足远程处理要求的计算机上使用它们。

  1. 以下命令使用 Invoke-CommandAsJob 参数在 Server01 计算机上启动作业。该作业运行一个 Get-Eventlog 命令来获取系统日志中的事件。您可以使用 JobName 参数为作业指定显示名称。

    Invoke-Command -computername Server01 -scriptblock {
      Get-Eventlog system} -AsJob
    

    该命令的结果类似于以下示例输出。

    SessionId   Name   State    HasMoreData   Location   Command
    ---------   ----   -----    -----------   --------   -------
    1           Job1   Running  True          Server01   Get-Eventlog system
    

    使用 AsJob 参数时,Invoke-Command 返回的作业对象类型与 Start-Job 返回的作业对象类型相同。您可以将作业对象保存在变量中,也可以使用 Get-Job 命令来获取作业。

    请注意,Location 属性的值显示作业在 Server01 计算机上运行。

  2. 要管理使用 Invoke-Command cmdlet 的 AsJob 参数启动的作业,请使用 Job cmdlet。由于代表远程作业的作业对象位于本地计算机上,因此您不需要运行远程命令来管理作业。

    要确定作业是否完成,请使用 Get-Job 命令。以下命令获取当前会话中启动的所有作业。

    Get-Job
    

    由于远程作业是在当前会话中启动的,因此本地 Get-Job 命令会获取该作业。作业对象的 State 属性显示该命令已成功完成。

    SessionId   Name   State      HasMoreData   Location   Command
    ---------   ----   -----      -----------   --------   -------
    1           Job1   Completed  True          Server01   Get-Eventlog system
    
  3. 要获取作业的结果,请使用 Receive-Job cmdlet。由于作业结果会自动返回到作业对象所在的计算机,因此您可以使用本地 Receive-Job 命令获取结果。

    以下命令使用 Receive-Job cmdlet 来获取作业的结果。它使用会话 ID 来识别作业。此命令将作业结果保存在 $results 变量中。您还可以将结果重定向到文件。

    $results = Receive-Job -id 1
    

启动远程作业,将结果保留在远程计算机上

要在远程计算机上启动作业并将命令结果保留在远程计算机上,请使用 Invoke-Command cmdlet 在远程计算机上运行 Start-Job 命令。您可以使用此方法在多台计算机上运行作业。

当您远程运行 Start-Job 命令时,将在远程计算机上创建作业对象,并在远程计算机上维护作业结果。从工作的角度来看,所有操作都是本地的。您只需远程运行命令来管理远程计算机上的本地作业。

  1. 使用 Invoke-Command cmdlet 在远程计算机上运行 Start-Job 命令。

    此命令需要 PSSession(持久连接)。如果使用Invoke-Command 的ComputerName 参数建立临时连接,则在返回作业对象时,Invoke-Command 命令被认为已完成。结果,临时连接被关闭,作业被取消。

    以下命令使用 New-PSSession cmdlet 创建连接到 Server01 计算机的 PSSession。该命令将 PSSession 保存在 $s 变量中。

    $s = New-PSSession -computername Server01
    

    下一个命令使用 Invoke-Command cmdlet 在 PSSession 中运行 Start-Job 命令。 Start-Job 命令和 Get-Eventlog 命令用大括号括起来。

    Invoke-Command -session $s -scriptblock {
      Start-Job -scriptblock {Get-Eventlog system}}
    

    结果类似于以下示例输出。

    Id       Name    State      HasMoreData     Location   Command
    --       ----    -----      -----------     --------   -------
    2        Job2    Running    True            Localhost  Get-Eventlog system
    

    当您远程运行 Start-Job 命令时,Invoke-Command 返回的作业对象类型与 Start-Job 返回的作业对象类型相同。您可以将作业对象保存在变量中,也可以使用 Get-Job 命令来获取作业。

    请注意,Location 属性的值显示该作业在本地计算机(称为“LocalHost”)上运行,即使该作业在 Server01 计算机上运行也是如此。由于作业对象是在 Server01 计算机上创建的,并且该作业在同一台计算机上运行,因此它被视为本地后台作业。

  2. 要管理远程作业,请使用Job cmdlet。由于作业对象位于远程计算机上,因此您需要运行远程命令来获取、停止、等待或检索作业结果。

    要查看作业是否已完成,请使用 Invoke-Command 命令在连接到 Server01 计算机的 PSSession 中运行 Get-Job 命令。

    Invoke-Command -session $s -scriptblock {Get-Job}
    

    该命令返回一个作业对象。作业对象的 State 属性显示命令已成功完成。

    SessionId   Name  State      HasMoreData   Location   Command
    ---------   ----  -----      -----------   --------   -------
    2           Job2  Completed  True          LocalHost   Get-Eventlog system
    
  3. 要获取作业的结果,请使用 Invoke-Command cmdlet 在连接到 Server01 计算机的 PSSession 中运行 Receive-Job 命令。

    以下命令使用 Receive-Job cmdlet 来获取作业的结果。它使用会话 ID 来识别作业。此命令将作业结果保存在 $results 变量中。它使用 Receive-Job 的 Keep 参数将结果保存在远程计算机上的作业缓存中。

    $results = Invoke-Command -session $s -scriptblock {
      Receive-Job -SessionId 2 -Keep
    }
    

    您还可以将结果重定向到本地或远程计算机上的文件。以下命令使用重定向运算符将结果保存在 Server01 计算机上的文件中。

    Invoke-Command -session $s -command {
      Receive-Job -SessionId 2 > c:\logs\pslog.txt
    }
    

如何作为独立进程运行

如前所述,当父会话终止时,所有正在运行的子作业及其子进程都将终止。您可以在本地计算机上使用远程处理来运行未附加到当前 PowerShell 会话的作业。

在本地计算机上创建新的 PowerShell 会话。使用 Invoke-Command 在此会话中启动作业。 Invoke-Command 允许您断开远程会话并终止父会话。稍后,您可以启动新的 PowerShell 会话并连接到之前断开连接的会话以恢复监视作业。但是,当会话终止时,返回到原始 PowerShell 会话的任何数据都会丢失。重新连接时,仅返回断开连接后生成的新数据对象。

# Create remote session on local machine
PS> $session = New-PSSession -cn localhost

# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job

Id     Name     PSJobTypeName   State         HasMoreData     Location      Command
--     ----     -------------   -----         -----------     --------      -------
1      Job1     RemoteJob       Running       True            localhost     1..60 | % { sleep 1; ...

# Disconnect the job session
PS> Disconnect-PSSession $session

Id Name         Transport ComputerName    ComputerType    State         ConfigurationName     Availability
-- ----         --------- ------------    ------------    -----         -----------------     ------------
1 Runspace1     WSMan     localhost       RemoteMachine   Disconnected  Microsoft.PowerShell          None

PS> $job

Id     Name     PSJobTypeName   State         HasMoreData     Location      Command
--     ----     -------------   -----         -----------     --------      -------
1      Job1     RemoteJob       Disconnected  True            localhost     1..60 | % { sleep 1;

# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...

对于本示例,作业仍附加到父 PowerShell 会话。但是,父会话不是运行 Invoke-Command 的原始 PowerShell 会话。

参见

  • 关于乔布斯
  • 关于职位详情
  • about_Remote
  • about_Remote_Variables
  • Invoke-Command
  • Get-Job
  • Remove-Job
  • Start-Job
  • Stop-Job
  • Wait-Job
  • 输入-PSSession
  • 退出-PSSession
  • 新 PS 会话

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯